Наследование модели в django не добавляет никакой информации о типе в базовый класс.Таким образом, на самом деле невозможно преобразовать объекты вниз из Animal () в соответствующие им формы.
Наследование используется только для отображения полей в унаследованной модели обратно в родительские модели.Таким образом, если в Animal есть поле name
, то же поле будет существовать в Cat
, а при сохранении Cat
будет обновлено animal
.
Наследование работает путем добавления отношения OneToOne:
class Animal(Model):
name = CharField()
class Cat(Model):
animal_ptr = OneToOneField(Animal)
Cat(name='Murky').save()
print repr(list(Animals.objects.all()))
: [Animal(name='Murky')]
Технически в вашей ситуации для Animal () даже возможно быть одновременно Dog () и Cat ():
animal = Animal()
animal.save()
Cat(animal_ptr=animal).save()
Dog(animal_ptr=animal).save()
Способ решения вашей проблемы будетдобавить поле subtype
или аналогичное вашему Animal()
объекту и реализовать функцию понижения рейтинга:
class Animal(Model):
subtype = CharField()
def downcast(self):
if self.subtype == 'cat':
return self.cat
# The self.cat is a automatic reverse reference created
# from OneToOne field with the name of the model
for animal in Animal.objects.all().select_related('dog', 'cat', ...)]:
animal.downcast().say_something()
Несколько полезных операций чтения при переполнении стека с похожими темами: Универсальное множество-ко-многимотношения он капот. Как моделировать наследование в реляционных базах данных?