我有一个这样的设置(为这个问题简化了):
class Employee(models.Model):
name = models.CharField(name, unique=True)
class Project(models.Model):
name = models.CharField(name, unique=True)
employees = models.ManyToManyField(Employee)
当员工即将被删除时,我想检查他是否与任何项目有关联。如果是,删除应该是不可能的。
我知道信号和如何工作。我可以连接到pre_delete
信号,并使其引发类似ValidationError
的异常。这样可以防止删除,但表单等并不能很好地处理它。
这似乎是其他人会遇到的情况。我希望有人能指出一个更优雅的解决方案。
对于那些引用这些具有相同问题且具有
ForeignKey
关系的问题的人,正确的答案是在ForeignKey
关系上使用Djago的on_delete=models.PROTECT
字段。这将阻止删除任何具有外键链接的对象。这不适用于ManyToManyField
关系(如this问题中所讨论的),但适用于ForeignKey
字段。所以如果模型是这样的,这将防止删除 任何具有一个或多个与其关联的
Project
对象的Employee
对象:文档可以找到HERE。
如果您知道永远不会有任何大规模的员工删除尝试,您可以覆盖模型上的
delete
,并且只有在合法操作时才调用super
。不幸的是,任何可能调用
queryset.delete()
的内容都将直接转到SQL: http://docs.djangoproject.com/en/dev/topics/db/queries/#deleting-objects但我不认为这是个大问题,因为你是编写这段代码的人,可以确保员工永远不会有任何
queryset.delete()
。手动调用delete()
。我希望删除员工是比较少见的。
我在寻找这个问题的答案,却找不到一个好的答案,这对Model.Model.delete()和QuerySet.delete()都有效。我一直在执行史蒂夫K的解决方案。我使用这个解决方案来确保对象(本例中的Employee)不能以任何方式从数据库中删除,而是设置为inactive。
这是个迟交的答复。。只是为了其他人看我把我的解决方案放在这里。
代码如下:
用法:
或者在管理员:
相关问题 更多 >
编程相关推荐