我有一个需要进行多个查询的过程,但是所有这些查询都有一些共同之处,所以我尝试通过一次更大的查询来优化它,这将只包含所有信息,然后从中进行子查询。问题是当我检查执行的sql时,它仍在为每个子查询命中数据库。
首先,我必须问一下当前版本中是否可以使用Django,以及旧版本中是否可以使用(获得和1.4.x中的应用程序)以及我该怎么做?
逻辑比这更复杂,它有另一个用于另一个对象,但想法如下:
#I need it to hit the db here:
big_query = MyModel.objects.filter(something = something)
for object in another_model_query_set:
...
#I need it not to hit the db here:
sub_query = big_query.filter(another_something = object.something)
...
感谢您的时间
答案 0 :(得分:1)
如果您不想再次访问数据库,并且确定所有数据都包含在第一个查询中,那么您需要在纯Python中进行过滤。 / p>
sub_query = [obj for obj in big_query if obj.something = another_something]
等等。请注意,这将返回列表而不是查询集,并且您无法使用任何标准查询集方法(如sort);再次,你需要使用标准的Python排序方法来做到这一点。
答案 1 :(得分:0)
如果您尚未阅读about Queryset evaluation:
<强>模板强>
您可以使用with
缓存查询集并在其上循环而无需访问数据库。
{% with cached_queryset=object.related_name.all %}
{% for object in cached_queryset %}
{# no db hit #}
todo
{% endfor %}
{% endwith %}
<强>视图强>
你可以使用发电机,它真棒,this is priceless tutorial
sub_query = [obj for obj in big_query if obj.something == another_something]
(从丹尼尔复制)