2009-04-04 1 views
0

Я использую фрагмент в http://www.djangosnippets.org/snippets/1034/ для моего наследования модели. Он отлично работает в первую очередь. Однако после удаления некоторых элементов в базе данных код работает неправильно. Как я отлаживаю, я обнаружил, что проблема заключается в методе: as_leaf_class. В следующем коде:Проблема в наследовании модели при удалении некоторых элементов

if (model == Meal): 
    return self 
return model.objects.get(id=self.id) 

последняя строка вызовет ошибку, когда элемент будет удален. Любой может дать решение для этого?

модель наследования с менеджером типа контента и наследственного-зависимые

from django.db import models 
from django.contrib.contenttypes.models import ContentType 
from django.db.models.query import QuerySet 

class SubclassingQuerySet(QuerySet): 
    def __getitem__(self, k): 
     result = super(SubclassingQuerySet, self).__getitem__(k) 
     if isinstance(result, models.Model) : 
      return result.as_leaf_class() 
     else : 
      return result 
    def __iter__(self): 
     for item in super(SubclassingQuerySet, self).__iter__(): 
      yield item.as_leaf_class() 

class MealManager(models.Manager): 
    def get_query_set(self): 
     return SubclassingQuerySet(self.model) 

class Meal (models.Model) : 
    name = models.TextField(max_length=100) 
    content_type = models.ForeignKey(ContentType,editable=False,null=True) 
    objects = MealManager() 

    def save(self, *args, **kwargs): 
     if(not self.content_type): 
      self.content_type = ContentType.objects.get_for_model(self.__class__) 
      super(Meal, self).save(*args, **kwargs) 

    def as_leaf_class(self): 
     content_type = self.content_type 
     model = content_type.model_class() 
     if (model == Meal): 
      return self 
     return model.objects.get(id=self.id) 

class Salad (Meal) : 
    too_leafy = models.BooleanField(default=False) 
    objects = MealManager() 
+0

Пожалуйста, сообщите нам, какое исключение поднято. ObjecDoesNotExist? Может помочь трассировка стека. –

ответ

0

Я не знаю, если это фрагмент кода по-прежнему актуальна сейчас, что вы можете использовать abstract base classes.

Это позволяет объявить модель, а не таблицы db, но другие модели могут наследовать.

+0

Есть все еще варианты использования для наследования модели на основе таблицы (хотя и не очень много, если вы спросите меня). –

0

Первый ответ: Почему вы пытаетесь вызвать as_leaf_class на удаленном объекте? Если это причиняет боль, когда вы это делаете, не делайте этого.

Второй ответ заключается в том, что вы можете обернуть неудачную строку с помощью try ... except Meal.DoesNotExist и вернуть None или self или что-то еще.

Смежные вопросы