Django - 查询重复/低效

Pao*_*ino 4 python django

好吧,我有一个Django视图,像这样:

@render_to('home/main.html')
def login(request):
    # also tried Client.objects.select_related().all()
    clients = Client.objects.all()
    return {'clients':clients}
Run Code Online (Sandbox Code Playgroud)

我有一个模板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>
Run Code Online (Sandbox Code Playgroud)

我还打印出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; 
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么要进行所有这些查询?它不应该只是1个查询来检索所有客户端和每个客户端的查询以从每个客户端检索所有宠物?我在home_client表中有2个客户端,因此总共应该有3个查询.最令人不安的是查询3和4是100%相同的.我不想"过早地优化"或任何其他东西,但我确实希望确保Django的效率不高.任何有关这方面的帮助将不胜感激.谢谢.

S.L*_*ott 7

Django使用缓存.RDBMS使用缓存.不要过早地优化查询.

您可以在视图函数中使用批量查询,而不是在模板中使用一次一个查询.

@render_to('home/main.html')
def login(request):
    # Query all clients 
    clients = Client.objects.all()
    # Assemble an in-memory table of pets
    pets = collections.defaultdict(list)
    for p in Pet.objects.all():
        pets[pet.client].append(p)
    # Create clients and pets tuples
    clientsPetTuples = [ (c,pets[c]) for c in clients ]
    return {'clientPets': clientsPetTuples}
Run Code Online (Sandbox Code Playgroud)

但是,您似乎没有任何证据表明您的模板是应用程序中最慢的部分.

此外,这会对SQL使用的巨大内存使用进行折衷.在您进行测量以证明模板查询实际上很慢之前,您不应该过度思考SQL.

在有证据之前不要担心SQL.