#django
#django
Вопрос:
Я пытаюсь получить доступ к связанной модели в шаблоне следующим образом:
course.course_set.all.0.section_set.all.0.student_assignation.count
Проблема в том, что я хотел бы подсчитать все назначения учащихся, которые имеют active = True
свойство.
Я хотел бы иметь возможность сделать что-то вроде этого:
course.course_set.all.0.section_set.all.0.student_assignation(active=True).count
Как я могу выполнить это в шаблоне django?
Ответ №1:
Шаблоны Django не предназначены для таких сложных запросов. Есть несколько способов справиться с этим
Во-первых, создайте пользовательский тег шаблона django
Во-вторых, создайте метод класса, который будет предоставлять эту информацию.
Пример
class Course:
...
def sutdent_assign_count(self):
#Your query goes here..
Комментарии:
1. Создание пользовательского фильтра шаблона для простого добавления также
.filter(active=true)
должно работать.2. Конечно, но это привело бы к разделению логики и большему количеству ошибок в коде, если только это не повторяющийся шаблон
3. Другой вариант — использовать метод all_active() в пользовательском менеджере. Но я думаю, нам нужно больше знать о том, что он пытается сделать.
4. Я думал о менеджере. Но проблема в том, что я не всегда хочу, чтобы применялся фильтр. если я создам
student_assign_count(self):
, как предложил karthikr, как мне создать запрос для фильтрации на основе текущего набора запросов?5. Я не думаю, что вам это нужно для каждого набора запросов. Вам это нужно для каждого объекта. Пример:
course.course_set.first().section_set.first().student_assignation(active=True).count()
— Конечно, для этого могут потребоваться изменения, но вы поняли идею
Ответ №2:
У вас слишком много логики в шаблоне. Создайте метод в одном из ваших классов моделей, который фактически возвращает нужное вам число; Я бы предложил один, но слишком неясно, что вы делаете (почему .all.0
, разве другие результаты не важны? Почему course.course_set, это много для многих для себя?). На что похожи ваши модели?
Как бы вы описали то, что вы отображаете на английском языке? Это, вероятно, дает подсказку о том, какой метод вы должны создать.