防止Django级联删除到超类

时间:2016-02-11 22:39:04

标签: python django django-models cascade

我有这些模特。

# models.py
class A(models.Model):
    name = models.CharField('Name', max_length=50)

class B(A):
    a_ptr = models.OneToOneField('A', primary_key=True, editable=True, parent_link=True)
    number = models.CharField('Number', max_length=15)

我想要捕获的关系是每个B也是A,但A不一定是B.我可以使用ForeignKey,但我更喜欢引用B上的继承字段,例如B.name。

我打算使用这些模型的方式是A将始终首先实例化。每当B被实例化时,它将不得不选择一个现有的(但尚未被采用)B。

到目前为止这种方法效果很好,但我唯一的问题是级联删除。使用此设置,删除B将删除其相应的A(或至少在django的管理员中发生的情况)。我怎么能把这个级联关掉?

我知道on_delete属性,但是如果我将其设置为a_ptr字段上的DO_NOTHING,它将具有允许B存在而没有相应的A而不是相反的效果。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您实际上可以将keep_parents=True传递给模型上的删除方法。

a = A.objects.create(name='a')
b = B.objects.create(a_ptr=a, number='1')

b.delete(keep_parents=True)
assert A.objects.filter(pk=a.pk).exists()

注意:在Django 1.9中添加了keep_parents参数。对于旧版本的Django,您可能需要使用this answer