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,可以随时更改。它也不会发送任何信号,对级联也没有保护。