gpt4 book ai didi

python - 防止 Django 级联删除父类(super class)

转载 作者:行者123 更新时间:2023-11-28 18:32:44 24 4
gpt4 key购买 nike

我有这些模型。

# 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.姓名。

我打算使用这些模型的方式是 A 总是首先被实例化。每当实例化 B 时,它都必须选择一个现有的(但尚未使用)B。

到目前为止,这工作得很好,但我遇到的唯一问题是级联删除。使用此设置,删除 B 将删除其对应的 A(或者至少在 django 的管理员中会发生这种情况)。我怎样才能关闭这种级联?

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

我该怎么做?

最佳答案

您实际上可以将 keep_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()

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

关于python - 防止 Django 级联删除父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35351498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com