【问题标题】:Django ORM with Postgres: rows unexpectedly deleted - Bug?带有 Postgres 的 Django ORM:行意外删除 - 错误?
【发布时间】:2010-09-20 10:07:43
【问题描述】:

我遇到了对象被意外删除并创建了一个最小示例的问题。不知道是bug还是思维错误。

模型是这样的:

class A(models.Model):
    related = models.ForeignKey('C', blank = True, null = True)

class B(models.Model):
    title = models.CharField(max_length = 255, blank = True, null = True)

class C(models.Model):
    b = models.OneToOneField('B', blank = True, null = True, related_name = 'c')

这是测试用例:

a1 = A()
a1.save()

b1= B()
b1.save()

c1 = C()
c1.b = b1
c1.save()

b1 = B.objects.all()[0]
b1.c.delete()
b1.delete()

self.failUnlessEqual(A.objects.count(),1)

我在删除 b1 之前明确删除了 b1.c。删除 b1.c 时,b1.c 为 NULL。似乎 A 的所有条目都被删除了,其中 A.related 为 NULL。

这是一个错误吗?我真的没想到所有对模型 C 有 NULL 引用的表的所有条目都被删除了。

我使用 Postgres 8.4 和 psycopg2 作为数据库后端。

最好的问候!

【问题讨论】:

    标签: python django postgresql django-models


    【解决方案1】:

    Django 默认使用“ON DELETE CASCADE”实现外键,这意味着指向已删除记录的记录也将被删除。这不是错误,它是故意这样设计的。

    讨论了解决方法elsewhere on stackoverflow

    【讨论】:

    • 没错。但是模型 A 用“blank = True”和“null = True”来引用 C。其次,它没有引用已删除的项目; A 对 C 的引用为 NULL。我的问题是:为什么当我运行给定的测试代码时,所有对 C 有 NULL 引用的 A 记录都被删除了。
    • 我创建了这些模型并找到了DEFERRABLE INITIALLY DEFERRED。它们是一样的吗?
    猜你喜欢
    • 2016-06-14
    • 2014-02-09
    • 2014-05-09
    • 2010-12-09
    • 2012-11-14
    • 2011-09-22
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多