[英]How to get inline model in post_save instance (Django Signals)?
[英]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.