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来删除可能重复的