Django post_save信号中如何克隆对象生成两条独立通知记录?
问题原因
你尝试的赋值方式notify2 = notify只是拷贝了模型实例的内存引用,两个变量指向的是同一个数据库记录对象。第一次调用save()会插入新记录并给实例的主键(默认是id字段)赋值,第二次调用save()只会更新这条已存在的主键对应的记录,不会生成新条目。
实现方案
方案1:直接创建两个独立实例(最稳妥,适合字段少的场景)
直接初始化两个Notifications对象分别保存即可,如果第二条通知的字段(比如接收人、通知类型)需要修改,直接调整第二个实例的对应字段就行:
if sender != blog.author and comment.is_published == "pending": # 给博主的通知 notify = Notifications( blog=blog, sender=sender, receiver=comment.blog.author, text_preview=comment_text[:250], notification_type="New Comment" ) notify.save() # 第二条通知(按需修改字段即可,比如可把接收人改为站点管理员) notify_copy = Notifications( blog=blog, sender=sender, receiver=comment.blog.author, text_preview=comment_text[:250], notification_type="New Comment" ) notify_copy.save()
方案2:清空主键克隆实例(适合字段多不想重复编写的场景)
Django中如果把已保存的模型实例的主键设为None,再调用save()就会作为新记录插入数据库:
if sender != blog.author and comment.is_published == "pending": notify = Notifications( blog=blog, sender=sender, receiver=comment.blog.author, text_preview=comment_text[:250], notification_type="New Comment" ) notify.save() # 清空主键,标记为未保存的新实例 notify.pk = None # 按需调整克隆后的字段,例如修改接收人:notify.receiver = admin_user notify.save() # 两次save会生成两条完全独立的数据库记录
注意事项
如果你的Notifications模型设置了唯一键约束,需要确保克隆后的字段组合不会触发唯一冲突,否则会导致保存失败。
内容的提问来源于stack exchange,提问作者boyenec
相关产品推荐
相关产品推荐

