Django:ForeignKey on_delete SET_默认行为 请让我考虑以下两个模型: 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)

Django:ForeignKey on_delete SET_默认行为 请让我考虑以下两个模型: 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),django,Django,除一次操作外,所有操作均按预期进行。我仍然可以毫无例外地做到以下几点: p = Policy.objects.get(name='default') p.delete() 这将生成孤立的项s,这些项引用“default”策略对象。 不幸的是,此操作导致数据库中出现完整性问题,因为有项s policy\u id列现在引用了policy表中丢失的记录 我怎样才能防止这种情况发生?如果没有项目引用,则删除“default”策略是我可以接受的。这取决于您的业务需求。是否每个项目都应指向有效的策略?从业

除一次操作外,所有操作均按预期进行。我仍然可以毫无例外地做到以下几点:

p = Policy.objects.get(name='default')
p.delete()
这将生成孤立的
s,这些项引用“default”
策略
对象。 不幸的是,此操作导致数据库中出现完整性问题,因为有
s policy\u id列现在引用了
policy
表中丢失的记录


我怎样才能防止这种情况发生?如果没有
项目
引用,则删除“default”
策略
是我可以接受的。

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

  • 如果要在删除
    策略时删除
    项,请在\u delete=CASCADE
    上设置
  • 如果仍有任何
    项指向任何
    项,则不允许删除任何
    策略,请在\u delete=PROTECT
    上设置
    。在这种情况下,您必须
    尝试:policy.delete();除了ProtectedError:…
    之外,请在代码中使用它来处理这种情况
  • 如果您知道您的默认策略不会被删除,则在_delete上设置
    =设置_DEFAULT
    (您可以覆盖
    policy
    上的
    delete
    方法以避免删除默认策略)
  • 如果
    项可以没有
    策略,则在
    上设置
    。这在某些业务场景中可能有效。但在这种情况下,还必须具有
    null=True

考虑使用models.CASCADE来删除可能重复的