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. Кроме того, это делает поведение менее предсказуемым, а ограничения менее легко внедряемыми.