django - 如何通过带有 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.")
解决方案
我认为你真的想这样做:
@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 递归。
推荐阅读
- twitter-bootstrap - Change the size of a bootstrap pill badge?
- sql - 如何为消息查询添加日期行?
- angular - Nativescript 7 - 图像标记错误:java.io.FileNotFoundException(图像未加载)
- laravel - Laravel 模型项设置碳项但返回字符串
- java - 如何跟踪在java中创建的对象的数量
- angular - Angular Material mat-radio-button 不会更改选择
- swift - 有没有办法将错误从 firebase 登录到错误处理?
- c - 在C中逐行读取txt文件
- django - 在 Django REST Framework 中单次创建嵌套对象时出现类型错误
- swift - 如何正确格式化字符串以在 Swift 中填充标签