gpt4 book ai didi

python - Django:删除关系末尾时未触发 m2m_changed

转载 作者:行者123 更新时间:2023-11-28 21:50:26 25 4
gpt4 key购买 nike

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

我刚刚做了一个测试,看看当 ManyToMany 发生变化时我是否可以 Hook 一个事件。

我有一个 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 中触发?

最佳答案

这是一个错误,尚未修复: https://code.djangoproject.com/ticket/17688

关于python - Django:删除关系末尾时未触发 m2m_changed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31937208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com