gpt4 book ai didi

Django:外键 on_delete SET_DEFAULT 行为

转载 作者:行者123 更新时间:2023-12-02 00:38:21 25 4
gpt4 key购买 nike

请让我考虑以下两个模型:

class Policy(models.Model):
name = models.SlugField(max_length=256, blank = False, unique = True)
def default_policy():
return Policy.objects.get(name='default').pk
class Item(models.Model):
policy = models.ForeignKey('Policy', on_delete=models.SET_DEFAULT, default=default_policy)

除了一个操作外,一切都按预期工作。我仍然可以毫无异常(exception)地执行以下操作:

p = Policy.objects.get(name='default')
p.delete()

这会产生孤立的 Item,它们指的是“默认”Policy 对象。不幸的是,此操作会导致数据库中出现完整性问题,因为 Item 的 policy_id 列现在引用了 Policy 表的丢失记录。

我怎样才能防止这种情况发生?我可以接受在没有 Item 引用时删除“默认”Policy

最佳答案

这取决于您的业务需求。每个 Item 都应该始终指向一个有效的 Policy 吗?当 Policy 被删除时,从业务角度来看有什么要求?指向它的 Item 是否也应该被删除?我们不知道您的要求,所以很难回答您的问题。从技术角度来看,这些是您的选择:

  • 如果您希望在删除 Policy 时删除 Item,请设置 on_delete=CASCADE
  • 设置on_delete=PROTECT 如果您不想让任何Policy 被删除,如果仍然有任何Item 指向它。在这种情况下,您将不得不 尝试:policy.delete();除了 ProtectedError: ... 在您的代码中处理这种情况。
  • 如果您知道您的默认策略不会被删除,请设置 on_delete=SET_DEFAULT(您可以覆盖 Policy 上的 delete 方法以避免删除默认策略)。
  • 如果Item 可以没有Policy,则设置on_delete=SET_NULL。这在某些业务场景中可能有效。但在这种情况下,您还必须有 null=True

关于Django:外键 on_delete SET_DEFAULT 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48322538/

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