Python Django:删除关系结尾时未激发m2m_已更改

Python Django:删除关系结尾时未激发m2m_已更改,python,django,many-to-many,signals,django-orm,Python,Django,Many To Many,Signals,Django Orm,注意:由于生产环境的限制,我现在必须坚持使用django-1.4 我刚刚做了一个测试,看看当有很多变化时,我是否能抓住一个事件 我有一个组模型,其中包含多个项对象。每当任何组中的项发生更改时,我都希望对相关组实例执行一些操作 from django.db import models from django.db.models.signals import m2m_changed, post_delete, pre_delete class Item(models.Model):

注意:由于生产环境的限制,我现在必须坚持使用
django-1.4

我刚刚做了一个测试,看看当有很多变化时,我是否能抓住一个事件

我有一个
模型,其中包含多个
对象。每当任何组中的项发生更改时,我都希望对相关组实例执行一些操作

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)
如果我更改
实例上的
列表,则
m2m\u 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.delete()
我尝试通过表连接到m2m的delete信号,但显然,自动关系表没有触发信号

在my
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)
我现在的解决方案是手动检查更改。这些模型是通过RESTAPI公开的,所以我可以在更新请求结束时这样做(但我希望它能通过信号自动实现)


Django的新版本是否触发了这些“缺失”信号?

这是一个bug,尚未修复:

你有没有想过这一点?您是否可以对项目对象进行预/后删除连接
post\u delete.connect(项目已删除,发件人=项目)