Django post_save信号+ ManyToManyField:更多问题

时间:2014-10-22 16:54:34

标签: python django django-models

当我尝试将处理程序连接到模型的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字段的完整保存吗?

1 个答案:

答案 0 :(得分:0)

我也有这个问题。显然这是一个错误(7岁),并在3个月前修复:

https://code.djangoproject.com/ticket/6707

这也可能让您感兴趣,在这张票中,一位核心开发人员说这是按预期工作的,不会修复它:

https://code.djangoproject.com/ticket/13022