【问题标题】:Updating model with signals使用信号更新模型
【发布时间】:2022-01-10 18:43:50
【问题描述】:

现在我正在尝试借助 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 = 'Фотоальбомы'

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    我部分理解了为什么会发生这种情况,并将我的信号从 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 2021-11-19
      • 2020-08-13
      • 1970-01-01
      相关资源
      最近更新 更多