Хорошо, у меня есть представление Django, как это:Джанго - запросы, сделанные повтор/неэффективные
@render_to('home/main.html')
def login(request):
# also tried Client.objects.select_related().all()
clients = Client.objects.all()
return {'clients':clients}
И у меня есть шаблон, main.html
, как это:
<ul>
{% for client in clients %}
<li>{{ client.full_name }}</li>
<ul>
{% for pet in client.pets.all %}
<li>{{ pet.full_name }}</li>
{% endfor %}
</ul>
{% endfor %}
</ul>
Я также распечатать все запросы в sql_queries
внизу моего базового шаблона. Когда я запускаю эту точку зрения, следующие запросы сделаны:
SELECT `home_client`.`id`, ... FROM `home_client`;
SELECT `home_pet`.`id`, ... FROM `home_pet` WHERE `home_pet`.`client_id` = 1;
SELECT `home_client`.`id`, ... FROM `home_client` WHERE `home_client`.`id` = 1;
SELECT `home_client`.`id`, ... FROM `home_client` WHERE `home_client`.`id` = 1;
SELECT `home_pet`.`id`, ... FROM `home_pet` WHERE `home_pet`.`client_id` = 2;
SELECT `home_client`.`id`, ... FROM `home_client` WHERE `home_client`.`id` = 2;
Мой вопрос, почему все эти запросы делаются? Разве это не должно быть 1 запрос для извлечения всех клиентов и запроса на клиента для извлечения всех домашних животных от каждого клиента? У меня есть 2 клиента в таблице home_client
, поэтому это должно быть 3 запросов. Больше всего беспокоит то, что запросы 3 и 4 на 100% идентичны. Я не хочу «преждевременно оптимизировать» или что-то еще, но я хочу убедиться, что Django не дико неэффективен. Любая помощь по этому поводу будет оценена по достоинству. Благодарю.
Да, у Pet есть только имя, фамилия от фамилии клиента. Является ли это большой проблемой, что это происходит, или кэш Django, и все, что делает хорошую работу, что я могу спать по ночам, чтобы получить доступ к последней фамилии так, как я, или мне лучше всего использовать собственное имя? –
Django делает некоторое кэширование, но кеш для каждого клиента Pet находится в экземпляре Pet. Что вы делаете, у вас будет (1 + количество клиентов + количество домашних животных) запросов для этой страницы. С моим предложением на месте, вы закончите с (1 + количество запросов клиентов). С S.Lott's: 2 вопроса. –
Благодарим за помощь. Пробовал код. Я буду взвешивать свои варианты здесь. –