Я хочу изменить количество полей ManyToMany во время сохранения моей модели. Для которого я изменил save (). Если я запускаю save (), счетчик обновляться не будет. Если я запускаю save второй раз, не обновляя поле, он обновит счетчик.

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 ().

1
Nilesh Dubey 7 Июл 2019 в 14:00

2 ответа

Лучший ответ

Если производительность не является проблемой, оба поля можно превратить в свойства, которые рассчитывают значение при каждом доступе

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()
0
Iain Shelvington 7 Июл 2019 в 12:45
 def save(self, *args, **kwargs):
        self.following_count = self.following.all().count()
        super(UserProfile, self).save(*args, **kwargs)

Сначала получите счетчик, а затем вызовите метод сохранения.

1
ma_dev_15 7 Июл 2019 в 11:07