Python 防止Django级联删除到超类
我有这些模型Python 防止Django级联删除到超类,python,django,django-models,cascade,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)
# 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
我打算使用这些模型的方式是,始终首先实例化。无论何时实例化一个B,它都必须选择一个现有的(但尚未采用的)B
到目前为止,这工作得很好,但我唯一的问题是级联删除。在这个设置中,删除一个B将删除它对应的a(或者至少在django的管理中是这样)。我该如何关闭此级联
我知道on_delete属性,但是如果我在a_ptr字段中将其设置为,比如不执行任何操作,它将产生允许B在没有相应a的情况下存在的效果,而不是相反
我该怎么做呢?您实际上可以将
keep\u parents=True
传递给模型上的delete方法
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。非常聪明(在删除之前切换b.a\u ptr
指向不同的实例)。我不知道是否有一种不太老套的方法。这两种方法都不支持批量删除,对吗?对,QuerySet上的delete
方法不接受任何参数。如果您确实需要批量删除,可以使用\u raw\u delete
——例如B.objects.all()。\u raw\u delete(B.objects.db)
——但这不是官方API,可以随时更改。它也不会发送任何信号,对级联也没有保护。