Наследование в Django: Заставьте родительский класс возвращаться к дочернему методу
Tl;Dr: Обход того, что родители не могут вызывать методы детей в python (я предполагаю)
Рассмотрим следующие (упрощенные) модели django: MaterialInstance
и BookInstance
оба наследуют Item
.
class Item(models.Model):
"""Represents an item that is physically in the library"""
label = models.CharField(max_length=20, unique=True)
@property
def description(self) -> str:
raise NotImplementedError
class BookInstance(Item):
"""Represents a copy of a book that is physically in the library"""
@property
def description(self) -> str:
return str(self.book)
book = models.ForeignKey('Book', on_delete=models.RESTRICT)
class MaterialInstance(Item):
"""Represents a instance of a material that is physically in the library"""
@property
def description(self) -> str:
return str(self.material)
material = models.ForeignKey('Material', on_delete=models.RESTRICT, null=True)
Я хочу показать все элементы (книги И экземпляры материалов) в одной таблице. Одна строка должна быть описанием (либо название книги, либо название материала). Было бы неплохо использовать следующий шаблон (но это вызывает ошибку NotImplementedError
, так как родительский класс не пытается вызывать дочерние методы. Есть предложения по продуманной конструкции, которая обойдет эту проблему?
<table>
<tr>
<th>Label</th>
<th>Description</th>
</tr>
{% for item in item_list %}
<tr>{{ item.label }}</td>
<td>{{ item.description }}</td>
</tr>
{% endfor %}
</table>
Конечный результат должен выглядеть примерно так |Label|Description| |---|---| |B1 | Скучное название книги| |B2 | Скучное название книги| |M1 | Степлер| |M2 | Факел| |B3 | Разное название книги|