擅长:python、mysql、java
<p>django查询集是<a href="https://docs.djangoproject.com/en/dev/topics/db/queries/#querysets-are-lazy" rel="nofollow">lazy</a>,因此实际查询不是<a href="https://docs.djangoproject.com/en/dev/ref/models/querysets/#when-querysets-are-evaluated" rel="nofollow">evaluated until you use the data.</a></p>
<pre><code>allthings = Thing.objects.filter(**kwargs)
if 'name__startswith' in kwargs:
allthings = allthings.distinct('id')
</code></pre>
<p>在你实际使用数据之前,不应该进行任何查询。这对于过滤查询非常有用</p>
<hr/>
<p>从<a href="https://docs.djangoproject.com/en/dev/topics/db/queries/#querysets-are-lazy" rel="nofollow">docs</a>:</p>
<p>查询集是懒惰的——创建查询集的行为不涉及任何数据库活动。您可以整天将过滤器堆叠在一起,Django在计算QuerySet之前不会实际运行查询。看看这个例子:</p>
^{pr2}$
<p>虽然这看起来像是三次数据库命中,但实际上它只在最后一行(print(q))命中数据库一次。一般来说,查询集的结果在您“请求”之前不会从数据库中获取。执行此操作时,将通过访问数据库来计算查询集。有关确切何时进行求值的详细信息,请参见何时对QuerySets求值。在</p>