创建一个命中数据库的查询,然后在不打击的情况下从中创建其他数据库

时间:2014-12-04 15:19:40

标签: django django-queryset

我有一个需要进行多个查询的过程,但是所有这些查询都有一些共同之处,所以我尝试通过一次更大的查询来优化它,这将只包含所有信息,然后从中进行子查询。问题是当我检查执行的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)
   ...

感谢您的时间

2 个答案:

答案 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]

(从丹尼尔复制)