Наследование в 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 | Разное название книги|

Вернуться на верх