2015-04-12 50 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.')