【问题标题】:Django's Content Type framework does not trigger Cascade deleteDjango 的 Content Type 框架不会触发 Cascade 删除
【发布时间】:2014-06-25 01:11:57
【问题描述】:

假设有以下模型:

class DeltaCheck(models.Model):
    logs = generic.GenericRelation('Log')
    title = models.CharField(max_length=50)
    owner = models.ForeignKey(User)

class Log(models.Model):
    title = models.CharField(max_length=50)

    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

如果我创建一个 DeltaCheck 和几个日志,然后删除 DeltaCheck,这些日志也会被删除:

In [7]: Log.objects.count()
Out[7]: 10

In [8]: DeltaCheck.objects.get().delete()

In [9]: Log.objects.count()
Out[9]: 0

但是如果我删除了用户(owner 字段),DeltaCheck 会被删除,但不会删除日志,请看:

In [14]: Log.objects.count()
Out[14]: 10

In [15]: DeltaCheck.objects.get().owner.delete()

In [16]: DeltaCheck.objects.all()
Out[16]: []

In [17]: Log.objects.count()
Out[17]: 10

这是为什么呢?好像是个bug。

编辑 1:

奇怪的是,在失败的情况下,pre_delete 和 post_delete 信号都会被触发......中间会发生什么?

编辑 2:

好吧,这真是太奇怪了。如果我为pre_delete 信号定义一个 EMPTY 接收器...它可以工作:/ 刚刚添加:

@receiver(pre_delete)
def recv(**kwargs):
    pass

现在它可以工作了......

【问题讨论】:

  • 在这个主题上花了 30 秒,听起来确实像一个错误。特别是因为反向泛型关系被删除的事实纯粹是一个有用的实用程序/首先超出了通常的 ORM 行为。
  • 确实,这就是我在官方错误跟踪器code.djangoproject.com/ticket/22594 中开票的原因,现在我将删除信号接收器中的那些人...

标签: python django cascade django-contenttypes


【解决方案1】:

作为the bug report states,这肯定是一个已经修复的错误。

【讨论】:

    猜你喜欢
    • 2020-04-29
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 2017-10-08
    • 2016-04-27
    • 1970-01-01
    相关资源
    最近更新 更多