2015-04-12 32 views
0

引用我有以下型号:拒绝模式的缺失,如果它是一个多对多的关系

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

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

当我删除了一顿我想提出一个错误信息,如“您不能删除这顿饭,因为它在菜单中使用“,当在菜单中引用膳食时。

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

或者我必须通过所有Menu s并检查是否引用meal

+0

[Prevent delete in Django model](http://stackoverflow.com/questions/4825815/prevent-delete-in-django-model) – DTing

回答

0

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

我相信正确的方法是钩住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.') 
相关问题