<h2>一。链过滤法</h2>
<pre><code>not_deleted = User.objects.filter(active=True).filter(is_deleted=False)
</code></pre>
<p>@Cory Madden已经回答了。<code>User.objects.filter(active=True)</code>返回Queryset。所以你可以添加过滤方法。<code>active_users.filter(is_deleted=False)</code></p>
<h2>2。使用Q方法</h2>
<pre><code>from django.db.models import Q
not_deleted = User.objects.filter(Q(active=True) & Q(is_deleted=False)
</code></pre>
<p>更容易管理复杂的查询集。如果你想过滤用户id不是3怎么办?您可以使用Q simpley like<code>User.objects.filter(Q(active=True) & ~Q(id = 3))</code></p>
<hr/>
<p>回答你的意见</p>
<p>不管是否使用Q,它都有相同的原始查询。</p>
<pre><code>SELECT ... FROM ...
WHERE ("auth_user"."active" = True AND "auth_user"."is_deleted" = False)
</code></pre>
<p>数据库性能与您访问数据库以提取数据的频率有关,或者在按FK关系提取数据时使用诸如“Join”之类的重载方法。所以使用Q或不使用Q并不会带来性能差异,因为它有相同的查询语句。</p>
<p>另外</p>
<pre><code>user = User.objects.filter(active=True)
not_deleted = User.objects.filter(active=True).filter(is_deleted=False)
user = User.objects.filter(active=True)
not_deleted = user.filter(is_deleted=False)
</code></pre>
<p>不会给你带来性能差异。</p>
<p>奎丽斯特很懒。<code>user</code>和<code>not_deleted</code>变量只有queryset字符串。当您像上面这样定义变量时,它不会立即到达数据库。不管怎样,每个变量都会命中三次。</p>