Django:删除关系结束时未触发 m2m_changed
Posted
技术标签:
【中文标题】Django:删除关系结束时未触发 m2m_changed【英文标题】:Django: m2m_changed not fired when end of relation is deleted 【发布时间】:2015-11-03 09:49:29 【问题描述】:注意:由于生产环境的限制,我暂时必须坚持django-1.4
。
我刚刚做了一个测试,看看我是否可以在 ManyToMany 更改时挂钩事件。
我有一个 Group
模型,其中包含多个 Item
对象。每当任何组中的项目发生变化时,我都想对相关的 Group 实例做一些事情。
from django.db import models
from django.db.models.signals import m2m_changed, post_delete, pre_delete
class Item(models.Model):
name = models.CharField(max_length=32)
def __str__(self):
return self.name
class Group(models.Model):
name = models.CharField(max_length=32)
items = models.ManyToManyField(to=Item)
def items_changed(signal, sender, action, instance, reverse, model, pk_set, using, **kwargs):
print str(signal)
print action, instance, reverse, pk_set
m2m_changed.connect(items_changed, sender=Group.items.through)
如果我更改Group
实例上的items
列表,我显然会触发m2m_changed
事件。
>>> from sandbox.core.models import Group, Item
>>> item, created = Item.objects.get_or_create(name='f')
>>> g = Group.objects.get(pk=1)
>>> g.items.add(item)
pre_add Group object False set([5])
post_add Group object False set([5])
>>> g.items.remove(item)
pre_remove Group object False set([5])
post_remove Group object False set([5])
现在,当我删除关系的 Item
结尾时,什么都没有发生,但是关系表条目被正确删除。
>>> item.delete()
我尝试通过表连接到 m2m 的删除信号,但显然,自动关系表没有触发信号。
在我的models.py
模块中这样连接:
def group_items_pre_delete(signal, sender, instance, using, **kwargs):
print 'pre_delete', instance
def group_items_post_delete(signal, sender, instance, using, **kwargs):
print 'post_delete', instance
pre_delete.connect(group_items_pre_delete, sender=Group.items.through)
post_delete.connect(group_items_post_delete, sender=Group.items.through)
我现在的解决方案是手动检查更改。模型通过 REST API 公开,因此我可以在更新请求结束时执行此操作(但我希望它通过信号自动执行)。
那些“缺失”的信号是否在任何较新版本的 Django 中触发?
【问题讨论】:
你有没有想过这个问题?你能在 Item 对象上做一个 pre/post_delete 连接吗post_delete.connect(items_deleted, sender=Items)
【参考方案1】:
这是一个错误,尚未修复: https://code.djangoproject.com/ticket/17688
【讨论】:
以上是关于Django:删除关系结束时未触发 m2m_changed的主要内容,如果未能解决你的问题,请参考以下文章
在上下文之间传递 objectID 时未触发 to-many 错误
在 Django 中更新多对多关系时如何不触发“m2m_changed”信号?