Обновление модели с помощью сигналов
Теперь я пытаюсь обновить поле из моей модели с помощью сигнала post_save. Все работает хорошо на странице администратора, но поле "number_of_photos" обновляется только после того, как я нажимаю кнопку сохранения во второй раз. Почему это происходит?
Код сигнала:
@receiver(post_save, sender=PhotoAlbum) # noqa
def count_photos(sender, created, instance, *args, **kwargs): # noqa
instance.number_of_photos = instance.photos.count()
signals.post_save.disconnect(count_photos, sender=PhotoAlbum)
instance.save()
signals.post_save.connect(count_photos, sender=PhotoAlbum)
Модель:
class PhotoAlbum(models.Model):
title = models.CharField(verbose_name='Название альбома', max_length=50, null=True)
created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, verbose_name='Автор')
created_at = models.DateTimeField(verbose_name='Дата создания', editable=False,
default=datetime.datetime.today())
photos = models.ManyToManyField('Photo', verbose_name='Фото', blank=True, related_name='photo_albums')
number_of_photos = models.PositiveIntegerField(verbose_name='Количество фото', null=True, editable=False)
class Meta:
verbose_name = 'Фотоальбом'
verbose_name_plural = 'Фотоальбомы'
Я частично понял почему это происходит и изменил сигнал с post_save на m2m_changed, теперь мой код работает правильно. Код:
@receiver(m2m_changed, sender=PhotoAlbum.photos.through) # noqa
def count_photos(sender, instance, **kwargs): # noqa
instance.number_of_photos = instance.photos.count()
signals.m2m_changed.disconnect(count_photos, sender=PhotoAlbum)
instance.save()
signals.m2m_changed.connect(count_photos, sender=PhotoAlbum)