繁体   English   中英

Django:在models.py中的save()期间,PositiveIntegerField中的ManyToMany字段计数

[英]Django: Count of ManyToMany field in PositiveIntegerField during save() in a models.py

我想在保存模型期间更改ManyToMany字段的计数。 为此,我修改了save()。 如果我运行save(),count将不会更新。 如果我第二次运行保存而不更新该字段,它将更新计数。

class UserProfile(models.Model):

    follower = models.ManyToManyField('self', related_name='Followers',
        blank=True, symmetrical=False)
    following = models.ManyToManyField('self', related_name='Followings',
        blank=True, symmetrical=False)
    follower_count = models.PositiveIntegerField(null=True, blank=True,
        editable=False)
    following_count = models.PositiveIntegerField(null=True, blank=True,
        editable=False)

    class Meta:
        verbose_name = 'User Profile'
        verbose_name_plural = 'User Profiles'

    def __str__(self):
        return self.follower_count

    def save(self, *args, **kwargs):
        super(UserProfile, self).save(*args, **kwargs)
        self.following_count = self.following.all().count()

        self.follower_count = self.follower.all().count()
        super(UserProfile, self).save(*args, **kwargs)

我想用save()更新计数。

 def save(self, *args, **kwargs):
        self.following_count = self.following.all().count()
        super(UserProfile, self).save(*args, **kwargs)

首先获取计数,然后调用保存方法

您可以省略第一次保存,例如:

def save(self, *args, **kwargs):
    self.following_count = self.following.count()
    self.follower_count = self.follower.count()
    super(UserProfile, self).save(*args, **kwargs)

话虽如此,但由于以下几个原因,我不能完全确定上面的方法是一个好主意:

  1. 因为您要额外增加两个聚合,所以它“节省”了一个计算上昂贵的函数。
  2. 在两次保存之间,关注者/关注者的数量可能不会改变;
  3. 如果删除/添加关注者/关注者,则不会自动触发关注者/关注者的数量。 因此,在某些时候,计数将正确。

如果性能不成问题,则可以将两个字段都转换为可计算每次访问值的属性

class UserProfile(models.Model):

    follower = models.ManyToManyField('self', related_name='Followers',
        blank=True, symmetrical=False)
    following = models.ManyToManyField('self', related_name='Followings',
        blank=True, symmetrical=False)

    @cached_property
    def follower_count(self):
        return self.follower.count()

    @cached_property
    def following_count(self):
        return self.following.count()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM