Big O Notation: использование нескольких forloops в шаблоне Django против нескольких запросов с использованием фильтра в views.py - PullRequest
0 голосов
/ 14 декабря 2018

Это конкретный вопрос, основанный на попытке увеличить быстродействие при запросе данных.

Итак, я пытался выяснить в самом шаблоне Django, как нарушить условие с первой попытки.Кажется, что это невозможно, и все предложения были использовать вместо логики views.py .Это заставило меня попробовать фильтрацию на основе выполняемого условия.

В моем примере у меня есть два сценария, которые я сравниваю.


(1) В первом,У меня есть один запрос внутри моего views.py , чтобы получить все элементы.Естественно, Item - это схема, которую я использую в своих моделях.В любом случае, внутри шаблона, который я хочу визуализировать, у меня есть передаваемый контекст, и у меня есть 11 отдельных циклов forlops, все повторяющихся в одном и том же цикле all_items.Затем на основе условия (то есть item.category) отображается соответствующий html.

Опять-таки, я хотел сделать 1 цикл, а затем, основываясь на условии, выполнить рендеринг в соответствующие места, но пройти этот цикл all_items только один раз .К сожалению, я не могу разорвать цикл в шаблоне после условия не перерисовывать HTML, который я не хочу на каждой последующей итерации.

Итак, это привело меня к следующему сценарию:


(2) В своих представлениях я создал 11 отдельных запросов (например, item.objects.filter (category = '1')), item.objects.filter (category = '2' и т. д.) . Я, в свою очередь, назначаю каждую из них 11 отдельным переменным, передаваемым через мои представления, в качестве контекста для рендеринга в шаблоне. Это также позволяет мнеудалите условие в шаблоне, где я проверяю категорию.


Интересно, что в последнем примере каждый фильтр запросов аналогичен выполнению одного и того же forloop для all_items в шаблоне, просто сделал немного по-другому? Я экономлю какое-то время с последним? Трудно сказать, просто исходя из моего пользовательского опыта, поэтому любые идеи будут отличными. Спасибо.

1 Ответ

0 голосов
/ 14 декабря 2018

Если у вас есть модель Item, содержащая поля category и name, вы можете использовать values() и один запрос с filter() как:

categories = ['1', '2', ... '11']

items = item.objects.filter(category__in=categories).values('category','name')

В результате вы получите:

<QuerySet [{'category': '1', 'name': 'name1'}, {'category': 2, 'name': 'name2'}, ..., {'category': '11', 'name': 'name11'}]>

Вы можете зациклить items результат без всех этих отдельных запросов к базе данных.

Пожалуйста, прокомментируйте в случае каких-либо вопросов.

PS Я использовал name полеНапример, это может быть любое поле, представленное в вашей модели.

...