Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如果模型在多个关系中被引用,则拒绝删除该模型_Django_Django Models - Fatal编程技术网

Django 如果模型在多个关系中被引用,则拒绝删除该模型

Django 如果模型在多个关系中被引用,则拒绝删除该模型,django,django-models,Django,Django Models,我有以下型号: class Meal(models.Model): name_text = models.CharField(max_length=200) class Menu(models.Model): meals = models.ManyToManyField(Meal) 当我删除一顿饭时,我想在菜单中引用该餐时发出一条错误消息,如“您不能删除此餐,因为它在菜单中使用” 当我调用mean.delete()时,这顿饭就被删除了。 对于与ForeignKey关系类似的多

我有以下型号:

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

class Menu(models.Model):
    meals = models.ManyToManyField(Meal)
当我删除一顿饭时,我想在菜单中引用该餐时发出一条错误消息,如“您不能删除此餐,因为它在菜单中使用”

当我调用
mean.delete()
时,这顿饭就被删除了。 对于与ForeignKey关系类似的多个关系,是否有“on_deleted”属性


或者我必须浏览所有的
菜单
并检查是否有人参考了

最简单的方法是覆盖
delete()
模型的
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)

我认为正确的方法是抓住信号

可能重复的
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.')