Доступ к объекту на основе ссылки внешнего ключа в шаблоне 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 %}

Правда, логические возможности шаблонов ограничены, вы не можете использовать фильтры и т.д. непосредственно в шаблоне, но, опять же, вы бы и не хотели этого. Используйте ваши представления/модели/менеджеры, чтобы сделать это за вас, и передавайте переменные через контекст.

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