首页 > 解决方案 > 如何通过带有 post_save 的 django 信号填充模型字段?

问题描述

创建模型对象后,我想使用post_save信号在同一对象中使用 ID 和其他值填充另一个模型字段。

但这里真正的问题是,我如何从实例访问该字段?没有任何效果

示例: 用户创建了一个对象 ->id对象为 93 -> 我想添加#00093为同一对象中另一个字段的值。

模型.py

class Ticket(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    designation = models.CharField(max_length=255, blank=True, null=True)
    summary = models.CharField(max_length=255)

信号.py

@receiver(post_save, sender=Ticket)
def ticket_designation(sender, instance, **kwargs):
    instance.designation = "#" + "000" + str(instance.id)
    print("Ticket" + instance.designation + " was created.")

标签: django

解决方案


我认为你真的想这样做:

@receiver(post_save, sender=Ticket)
def ticket_designation(sender, instance, created, **kwargs):
    if created:
        designation = "#" + "000" + str(instance.id)
        Ticket.filter(pk=instance.pk).update(designation=designation)
        print("Ticket" + instance.designation + " was created.")

解释:

为什么使用if created:指定仅在创建新票证时创建一次。每次保存同一个对象时,它都不会更新。

为什么使用Ticket.objects.filter(..).update(..):我们不能这样做instance.save(),因为它会再次调用它post_save并发生递归。.updateon queryset 不会调用信号,所以我们很安全。


如果你想使用instance.save你可能想看看如何防止 django 中的 post_save 递归。


推荐阅读