我有这些模特。
# 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而不是相反的效果。
我该怎么做?
答案 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。