【发布时间】:2023-03-22 19:22:01
【问题描述】:
好的,我有一个 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 个查询来检索所有客户端,而每个客户端一个查询来检索每个客户端的所有宠物吗?我在home_client 表中有 2 个客户,所以总共应该是 3 个查询。最令人不安的是查询 3 和 4 是 100% 相同的。我不想“过早地优化”或任何东西,但我确实想确保 Django 不会非常低效。对此的任何帮助将不胜感激。谢谢。
【问题讨论】: