请允许我考虑以下两种模式:
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)
除了一个操作外,一切都按预期工作。没有任何例外,我仍然可以做以下事情:
p = Policy.objects.get(name='default')
p.delete()
这会产生孤立的Item
s,它们指的是“默认”Policy
对象。
遗憾的是,此操作会导致数据库中出现完整性问题,因为Item
个policy_id列现在引用了Policy
表的错过记录。
我怎么能防止这种情况发生?如果没有Policy
引用它,则删除“默认”Item
是我可以接受的。
答案 0 :(得分:2)
这取决于您的业务需求。每个Item
是否应始终指向有效的Policy
?当Policy
被删除时,从业务角度来看,需求是什么?指向它的Item
是否也应删除?我们不了解您的要求,因此很难回答您的问题。从技术角度来看,这些是您的选择:
on_delete=CASCADE
时删除Item
,请设置Policy
on_delete=PROTECT
如果您还不想删除任何Policy
,如果仍然有Item
指向该try: policy.delete(); except ProtectedError: ...
。在这种情况下,您必须在代码中on_delete=SET_DEFAULT
来处理这种情况。delete
(您可以覆盖Policy
上的on_delete=SET_NULL
方法以避免删除默认政策。Item
没有Policy
,请设置null=True
。这可能在某些业务场景中有效。但在这种情况下,您还必须拥有{{1}}。