Обновление модели с помощью сигналов

Теперь я пытаюсь обновить поле из моей модели с помощью сигнала 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)
Вернуться на верх