【问题标题】:Deny deletion of model if it is referenced in a ManyToMany Relationship如果模型在多对多关系中被引用,则拒绝删除模型
【发布时间】:2015-06-17 18:00:54
【问题描述】:

我有以下型号:

class Meal(models.Model):
    name_text = models.CharField(max_length=200)

class Menu(models.Model):
    meals = models.ManyToManyField(Meal)

当我删除餐点时,我想在菜单中引用餐点时引发错误消息,例如“您无法删除此餐点,因为它已在菜单中使用”。

在我打电话给meal.delete()的那一刻,这顿饭刚刚被删除。 ManyToMany-Relationships 是否有类似于 ForeignKey 关系的 on_deleted 属性?

或者我必须遍历所有Menus 并检查是否有人引用meal

【问题讨论】:

标签: django django-models


【解决方案1】:

最简单的方法是覆盖 Meal 模型的 delete() 方法。

class Meal(models.Model):
    name_text = models.CharField(max_length=200)

    def delete(self, *args, **kwargs):
        # count the total menus this meal is used in
        if self.menu_set.count() >  0:
            return "Can not delete this menu"
        else:
            super(Meal, self).delete(*args, **kwargs)

【讨论】:

    【解决方案2】:

    我认为正确的方法是挂钩pre_delete 信号。

    from django.db.models.signals import pre_delete
    from django.dispatch import receiver
    from myapp.models import Meal
    
    
    @receiver(pre_delete, sender=Meal)
    def on_meal_delete(sender, instance, **kwargs):
        if instance.menu_set.exists():
            raise ValueError('Cannot delete this meal. It has menus.')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 2010-12-21
      • 2014-02-02
      • 2019-05-09
      • 1970-01-01
      相关资源
      最近更新 更多