簡體   English   中英

如何使用 post_save 通過 Django 信號填充模型字段?

[英]how to populate a model field via django signals with post_save?

創建模型對象后,我想使用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.")

我認為你真的想這樣做:

@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並發生遞歸。 .update on queryset 不會調用信號,所以我們很安全。


如果您想使用instance.save您可能需要查看如何防止 Django 中的 post_save 遞歸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM