我有点想看到类似的问题(Django 从 post_save 信号访问 ManyToMany 字段),但仍然没有看到如何获取更新的相关对象列表。
例如。我有以下型号
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()
。例如。此处添加的用户不会反映出来。
m2m_changed
信号在保存/更新过程的几个阶段被触发,并且有一个action
提供给信号处理程序的参数,告诉您它处于哪个阶段。从文档:
action
指示对关系进行的更新类型的字符串。这可以是以下之一:
“预添加”在将一个或多个对象添加到关系之前发送。
“后添加”将一个或多个对象添加到关系后发送。
“预删除”在从关系中删除一个或多个对象之前发送。
“删除后”从关系中删除一个或多个对象后发送。
“预清除”在关系清除之前发送。
“post_clear”关系清除后发送。
如果你抓住了pre_remove
行动然后你会得到所有的对象before有些已从关系中删除。这就是为什么您看到的用户列表显然没有变化。
您的代码需要检查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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)