Доступ к объекту на основе ссылки внешнего ключа в шаблоне Django
В настоящее время у меня есть несколько моделей, связанных с помощью внешних ключей
(reduced) models.py:
class Saga(models.Model):
name = models.CharField(max_length=200)
description = models.CharField(max_length=1000)
startChapter = models.PositiveIntegerField()
endChapter = models.PositiveIntegerField()
class Arc(models.Model):
name = models.CharField(max_length=200)
description = models.CharField(max_length=1000)
saga = models.ForeignKey(Saga,on_delete=models.SET_DEFAULT,default=Saga.get_default_pk)
startChapter = models.PositiveIntegerField()
endChapter = models.PositiveIntegerField()
class Clip(models.Model):
description = models.CharField(max_length=200)
arc = models.ForeignKey(Arc,on_delete=models.SET_DEFAULT,default=Arc.get_default_pk)
chapter = models.PositiveIntegerField()
viewers = models.ManyToManyField(User, through='ClipViewer')
author = models.ForeignKey(User,on_delete=models.SET_NULL,null=True, related_name='author_of')
В основном все саги имеют набор связанных дуг, а каждая дуга имеет список связанных клипов.
Я хочу получить мои саги, дуги и клипы через вызовы API, затем пройтись по каждой саге, получить связанные дуги для этой саги, а затем пройтись по дугам, получить связанные клипы для этой дуги, например:
Saga 1 has arcs 1,2,3
Arc 1 has clips 1 & 2
Arc 2 has clip 3
Arc 3 has clips 4 & 5
Saga 2 has arc 4,5....
Но шаблоны кажутся слишком ограниченными для такого рода запросов, я не могу сделать что-то вроде получения списка связанных дуг для данной саги или чего-то подобного, а мне говорят:
Поскольку Django намеренно ограничивает объем логической обработки, доступной в языке шаблонов, невозможно передавать аргументы в вызовы методов, доступных из шаблонов. Данные должны вычисляться в представлениях, а затем передаваться в шаблоны для отображения.
не помогает моей проблеме, так как мне нужно выполнить доступ к данным в цикле for, который происходит в самом шаблоне.
Есть ли способ выполнить такой доступ к данным в шаблоне django или как-то передать соответствующие данные через представление.
Вполне возможно сделать это в шаблонах Django, скажем, вы передаете шаблону заданный кверисет saga_list
- вы можете получить доступ к обратному отношению "многие-к-одному" с помощью атрибута _set
. Django создает его автоматически, если вы не установили reverse_name
на поле ForeignKey:
{% for saga in saga_list %}
{{ saga }}
{% for arc in saga.arc_set.all %}
{{ arc }} # access arc properties normally
{% for clip in arc.clip_set.all %}
{{ clip }} # access clip properties too
{% endfor %}
{% endfor %}
{% endfor %}
Правда, логические возможности шаблонов ограничены, вы не можете использовать фильтры и т.д. непосредственно в шаблоне, но, опять же, вы бы и не хотели этого. Используйте ваши представления/модели/менеджеры, чтобы сделать это за вас, и передавайте переменные через контекст.