Python Django доступ к полям из унаследованной модели

Здравствуйте, у меня есть вопрос, связанный с наследованием моделей и доступом к полям в шаблоне Django.

Моя модель:

class Security(models.Model):
    name = models.CharField(max_length=100, blank=False)

class Stock(Security):
    wkn = models.CharField(max_length=15)
    isin = models.CharField(max_length=25)

class Asset(models.Model):
    security = models.ForeignKey(Security, on_delete=models.CASCADE,blank=False)

Мой views.py

context["assets"] = Asset.objects.all()

Мой шаблон:

{% for asset in assets %}
   {{ asset.security.wkn }}
...

Это дает мне ошибку, так как wkn не является полем безопасности. Подскажите, как решить эту проблему?

Заранее спасибо!

Django не поддерживает полиморфизм из коробки: даже если вы используете наследование и получаете элемент из базы данных, который является Stock, при запросе через Security вы получаете его как Security объект, так что без специфических Stock полей.

Наследование и полиморфизм часто являются болью в реляционных базах данных, и поэтому их часто следует не делать, если нет очень веских причин для этого.

В этом случае вы можете получить его с помощью:

{{ asset.security.stock.wkn }}

Но это приведет к дополнительным запросам и породит N+1 проблему.

Вы можете работать с django-polymorphic [readthedocs.io], где вы можете создавать подклассы из PolymorphicModel. Затем запросы пройдут по иерархии классов и добавят в базу данных множество дополнительных LEFT OUTER JOIN, а затем на основе полученных данных сгенерируют Stock или Security объект. Но, как вы, наверное, понимаете, такой запрос создает много дополнительной работы для базы данных и для Python. Кроме того, это делает поведение менее предсказуемым, а ограничения менее легко внедряемыми.

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