Я пытаюсь испечь что-то вроде модели "наследования одной таблицы" или "таблицы на иерархию" в 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
соответственно.