Django: количество полей ManyToMany в PositiveIntegerField во время сохранения () в models.py - PullRequest
1 голос
/ 07 июля 2019

Я хочу изменить количество полей 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 ().

Ответы [ 3 ]

1 голос
/ 07 июля 2019

Вы можете опустить первое сохранение, например:

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

При этом, я не совсем уверен, что вышесказанное является хорошей идеей по нескольким причинам:

  1. это делает «сохранение» вычислительно дорогой функцией, поскольку вы создаете два дополнительных агрегата;
  2. вполне вероятно, что между двумя сохранениями число фолловеров / последователей не изменится;
  3. если вы удаляете / добавляете подписчиков / подписчиков, вы не автоматически запускаете число подписчиков / подписчиков.Поэтому в определенные моменты времени число будет не правильным.
1 голос
/ 07 июля 2019
 def save(self, *args, **kwargs):
        self.following_count = self.following.all().count()
        super(UserProfile, self).save(*args, **kwargs)

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

0 голосов
/ 07 июля 2019

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

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...