我试图看到类似的问题(Django accessing ManyToMany fields from post_save signal),但仍然没有看到如何获取更新的相关对象列表。
E.g。我有以下模型
class User(models.Model):
username = models.CharField
class Blog(models.Model):
user = models.ManyToManyField('User')
现在我通过django admin将用户添加到给定的博客。
所以我希望下面的信号会打印所有新用户(我刚刚添加)......但是......我一直都在获取旧列表:(
@receiver(m2m_changed, sender=Blog.users.through)
def blog_users_change(sender, instance, **kwargs):
print instance.users.all()
最后一行显示旧用户列表instance.users.all()
。例如。这里添加的用户没有反映出来。
答案 0 :(得分:1)
m2m_changed
信号在保存/更新过程的几个阶段被触发,并且有一个action
参数提供给信号处理程序,告诉你它处于什么阶段。来自{{3 }}:
<强>动作强>
一个字符串,指示对关系执行的更新类型。这可以是以下之一:
<强> “pre_add”强> 在将一个或多个对象添加到关系之前发送。
<强> “post_add”强> 将一个或多个对象添加到关系后发送。
<强> “pre_remove”强> 在从关系中删除一个或多个对象之前发送。
<强> “post_remove”强> 从关系中删除一个或多个对象后发送。
<强> “pre_clear”强> 在关系被清除之前发送。
<强> “post_clear”强> 关系清除后发送。
如果您捕获pre_remove
操作,那么您将在之前获取所有对象,其中一些已从关系中删除。这就是为什么你看到一个明显不变的用户列表。
在决定做什么之前,您的代码需要检查action
。例如:
@receiver(m2m_changed, sender=Blog.users.through)
def blog_users_change(sender, instance, action, **kwargs):
if action == 'pre_remove':
# This will give you the users BEFORE any removals have happened
print instance.users.all()
elif action == 'post_remove':
# This will give you the users AFTER any removals have happened
print instance.users.all()