请让我考虑以下两种模式:
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()
这会产生引用“默认”Policy
对象的孤立Item
。不幸的是,此操作会导致数据库中的完整性问题,因为存在Item
,其policy_id列现在引用Policy
表中丢失的记录。
如何防止这种情况发生?当没有Item
引用时删除“default”Policy
对我来说是可以接受的。
2条答案
按热度按时间8yparm6h1#
这取决于您的业务需求。每个
Item
是否都指向一个有效的Policy
?删除Policy
时,从业务Angular 看有什么要求?指向它的Item
是否也要删除?我们不知道您的需求,因此很难回答您的问题。从技术Angular 看,您可以选择:Policy
时删除Item
,请设置on_delete=CASCADE
Policy
,并且仍然有Item
指向它,那么设置on_delete=PROTECT
。在这种情况下,你必须在代码中使用try: policy.delete(); except ProtectedError: ...
来处理这种情况。on_delete=SET_DEFAULT
(您可以覆盖Policy
上的delete
方法以避免删除默认策略)。Item
不能有Policy
,则设置on_delete=SET_NULL
。这在某些业务方案中可能有效。但在这种情况下,您还必须有null=True
。jk9hmnmh2#
我用
Django 4.1
和sqlite
重现了您的场景,并且得到了您等待的异常!但是,为了提供更多的可定制性,特别是在处理异常时,下面的代码可以与上述环境一起工作: