gpt4 book ai didi

django - 如何使用 post_save 通过 django 信号填充模型字段?

转载 作者:行者123 更新时间:2023-12-05 01:15:21 28 4
gpt4 key购买 nike

创建模型对象后,我想使用 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 不会调用信号,所以我们很安全。


如果你想使用instance.save,你可能想看看how to prevent post_save recursion in django.

关于django - 如何使用 post_save 通过 django 信号填充模型字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56360581/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com