Джанго полиморфизм взломать - PullRequest
0 голосов
/ 11 апреля 2011

Я пытаюсь испечь что-то вроде модели "наследования одной таблицы" или "таблицы на иерархию" в Django.

Вот что я хотел бы сделать:

class PolymorphicModel(models.Model):

   content_type = models.ForeignKey(ContentType)

   class Meta:
       abstract = True

   def __init__(self, *args, **kwargs):
       super(PolymorphicModel, self).__init__(*args, **kwargs)
       # Dynamically switch the class to the actual one
       self.__class__ = self.content_type.model_class()

   def save(self, *args, **kwargs):
       if not self.content_type:
           # Save the actual class name for the future.
           self.content_type = ContentType.objects.get_for_model(self.__class__)
           super(PolymorphicModel, self).save(*args, **kwargs)

А затем фактическая иерархия:

class Base(PolymorphicModel):

    a = models.IntegerField()
    b = models.IntegerField()

    @abstractmethod
    def something(self): pass


class DerivedA(Base):

    def something(self):
        return self.a


class DerivedB(Base):

    def something(self):
        return self.b

К сожалению, я получаю ошибку DoesNotExist при построении DerivedA().Он жалуется на то, что content_type не существует.

РЕДАКТИРОВАТЬ:

По поводу моих вопросов:

  • Почему я получаю исключение, какчтобы исправить это?

См. мой ответ ниже: content_type, по-видимому, не является жизнеспособным именем.

  • Это то, что я пытаюсь сделать выполнимым таким образом?

Да, это так!И это прекрасно работает.Использование имен классов вместо типа контента также возможно.Это имеет дополнительную ценность обработки proxy = True соответственно.

1 Ответ

1 голос
/ 11 апреля 2011

Упс, ну, видимо, content_type - зарезервированное имя. Я изменил имя свойства на ct, и теперь оно работает.

Я опубликовал решение здесь: http://djangosnippets.org/snippets/2408/

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