Проблема в наследовании модели при удалении некоторых элементов - PullRequest
0 голосов
/ 04 апреля 2009

Я использую фрагмент в 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()

Ответы [ 2 ]

0 голосов
/ 06 апреля 2009

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

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

0 голосов
/ 05 апреля 2009

Не знаю, актуален ли этот фрагмент сейчас, когда вы можете использовать абстрактные базовые классы.

Это позволяет вам объявить модель, которая не является таблицей БД, но может наследоваться другими моделями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...