Django:在信号中获取m2m相关对象

时间:2016-05-30 15:10:42

标签: python django

我试图看到类似的问题(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()。例如。这里添加的用户没有反映出来。

1 个答案:

答案 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()