当我尝试将处理程序连接到模型的post_save信号时,我发现模型的ManyToMany字段在那时是空的。我用Google搜索并在此处找到了解决方案:ManyToManyField is empty in post_save() function
解决方案是连接到模型的m2m_changed signal
。
不过我还有一些问题。
如何精确检测模型实例是否已创建且未更新
答案中有一个条件:
if action == 'post_add' and not reverse:
但是当我在管理界面中编辑实例时似乎无法正常工作(当我点击管理员中的“保存”按钮时,似乎触摸了m2m字段)。
通过在post_save
处理程序中分配实例属性,我发现了一种方法
并在m2m_changed
处理程序中检查它。
def on_m2m_changed(sender, instance, action, reverse, *args, **kwargs):
if action == "post_add" and not reverse and instance.just_created:
# do stuff
def on_save(sender, instance, created, *args, **kwargs):
instance.just_created = created
但对我而言,它看起来很糟糕,我不确定这是否正确。还有其他办法吗?
如果我们在模型中有多个m2m字段该怎么办?
更新模型的m2m字段的顺序是否明确定义,我们可以依赖它吗?或者我们应该连接到每个m2m_changed处理程序并在实例中操作标志/计数器?顺便说一下,我们可以依赖m2m_changed
post_save
的事实
可能有另一种方法来处理实例及其所有m2m字段的完整保存吗?
答案 0 :(得分:0)
我也有这个问题。显然这是一个错误(7岁),并在3个月前修复:
https://code.djangoproject.com/ticket/6707
这也可能让您感兴趣,在这张票中,一位核心开发人员说这是按预期工作的,不会修复它: