2016-12-02 55 views
0

我试图与Django的一些有效的查询在下面的循环:Django的:准备查询,但不执行它

for division in divisions: 
    playoffs = league.playoff_set.filter(division=division, double_elimination=True) 

我想,也许在循环之前只选择那些与double_elimination=True过滤playoffs会提高它:

playoffs = league.playoff_set.filter(double_elimination=True) 
for division in divisions: 
    division_playoffs = playoffs.filter(division=division) 

但现在我担心的是,这是在循环,而不是在先前检索结果过滤击发playoffs查询在每次运行。

它按预期工作还是我担心?我应该用Q来建立这些性能更好的查询吗?

+0

Django查询集很懒,它们没有执行直到你需要结果。 – Sayse

回答

4

Django querysets are lazy。这意味着,当你做

playoffs = league.playoff_set.filter(double_elimination=True) 

它,当你在循环再次过滤查询集甚至没有评估的查询集未评估。

division_playoffs = playoffs.filter(division=division) 

The queryset will only be evaluated当您访问其内容(无论是在视图或模板)。

playoffs = league.playoff_set.filter(double_elimination=True) 
for division in divisions: 
    division_playoffs = playoffs.filter(division=division) 
    for playoff in division_playoffs: # looping through queryset causes it to be evaluated 
     print(playoff) 

因此,您的代码的两个版本都将工作相同。你应该选择一个你认为更清晰的。

+0

因此,即使我坚持原来的方法(当每个循环中的查询是'playoffs = league.playoff_set.filter(division = division,double_elimination = True)'),它会一样有效吗? – dabadaba

+0

您可以使用类似Django调试工具栏的东西来查看生成的SQL查询。正如我所说的,你的代码的两个版本都是一样的。 – Alasdair

+0

您可以查看已经运行的SQL查询,可以帮助您了解引擎盖下的情况。 http://stackoverflow.com/questions/1074212/how-to-show-the-sql-django-is-running 如果有大量的分歧,但不是绝大多数季后赛,它可能是最好的只是查询'league.playoff_set.filter(double_elimination = True)',然后将结果分组到python中。例如。 http://stackoverflow.com/questions/31071888/python-group-list-items-in-a-dict –