Oli*_*r H 2 python django many-to-many signals django-orm
注意:由于生产环境的限制,我必须坚持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)
Run Code Online (Sandbox Code Playgroud)
如果我更改实例items上的列表Group,那么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])
Run Code Online (Sandbox Code Playgroud)
现在,当我删除Item关系的结尾时,没有任何反应,但是,关系表条目被正确删除.
>>> item.delete()
Run Code Online (Sandbox Code Playgroud)
我尝试通过表连接到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)
Run Code Online (Sandbox Code Playgroud)
我现在的解决方案是手动检查更改.模型通过REST API公开,所以我可以在更新请求结束时执行此操作(但我希望通过信号自动完成).
在任何较新版本的Django中都会发出那些"丢失"的信号吗?