当前位置:  开发笔记 > 编程语言 > 正文

Django - 查询重复/低效

如何解决《Django-查询重复/低效》经验,为你挑选了1个好方法。

好吧,我有一个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,像这样:

    {% for client in clients %}
  • {{ client.full_name }}
    • {% for pet in client.pets.all %}
    • {{ pet.full_name }}
    • {% endfor %}
    {% endfor %}

我还打印出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的效率不高.任何有关这方面的帮助将不胜感激.谢谢.



1> S.Lott..:

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}

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

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

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

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有