防止在 Django 模型中删除

新手上路,请多包涵

我有这样的设置(针对这个问题进行了简化):

 class Employee(models.Model):
    name = models.CharField(name, unique=True)

class Project(models.Model):
    name = models.CharField(name, unique=True)
    employees = models.ManyToManyField(Employee)

Employee 即将被删除时,我想检查他是否连接到任何项目。如果是这样,删除应该是不可能的。

我知道信号以及如何使用它们。我可以连接到 pre_delete 信号,并让它抛出类似 ValidationError 的异常。这可以防止删除,但不会被表单等优雅地处理。

这似乎是其他人会遇到的情况。我希望有人能指出一个更优雅的解决方案。

原文由 dyve 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 543
2 个回答

对于那些使用 ForeignKey 关系引用此问题的人,正确的答案是在 ForeignKey 关系上使用 Djago 的 on_delete=models.PROTECT 字段。这将防止删除任何具有外键链接的对象。这不适用于 ManyToManyField 关系(如 问题所述),但对 ForeignKey 字段非常有用。

因此,如果模型是这样的,这将有助于防止删除任何 Employee 对象,该对象具有一个或多个 Project 与之关联的对象:

 class Employee(models.Model):
    name = models.CharField(name, unique=True)

class Project(models.Model):
    name = models.CharField(name, unique=True)
    employees = models.ForeignKey(Employee, on_delete=models.PROTECT)

可以在 此处 找到文档。

原文由 user1847 发布,翻译遵循 CC BY-SA 3.0 许可协议

我一直在寻找这个问题的答案,但找不到一个对 models.Model.delete() 和 QuerySet.delete() 都适用的好的答案。我继续并在某种程度上实施了 Steve K 的解决方案。我使用此解决方案来确保对象(本例中为 Employee)无法以任何方式从数据库中删除,而是被设置为非活动状态。

这是一个迟到的答案..只是为了其他人看我把我的解决方案放在这里。

这是代码:

 class CustomQuerySet(QuerySet):
    def delete(self):
        self.update(active=False)

class ActiveManager(models.Manager):
    def active(self):
        return self.model.objects.filter(active=True)

    def get_queryset(self):
        return CustomQuerySet(self.model, using=self._db)

class Employee(models.Model):
    name = models.CharField(name, unique=True)
    active = models.BooleanField(default=True, editable=False)

    objects = ActiveManager()

    def delete(self):
        self.active = False
        self.save()

用法:

 Employee.objects.active() # use it just like you would .all()

或在管理员中:

 class Employee(admin.ModelAdmin):

    def queryset(self, request):
        return super(Employee, self).queryset(request).filter(active=True)

原文由 Elwin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题