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