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