<p>既然结果取决于<code>search_term</code>的可用性,为什么不在<code>search_term</code>上使用<code>if-else</code>。你知道吗</p>
<pre><code>search_term = request.GET.get('search_term', None)
if search_term:
# when search term is not None
# get relevant calculations
else:
calculations = Calculations.objects.all()
# rest of code
</code></pre>
<p>当<code>search_term</code>不是<code>None</code>时,您可以进一步简化代码,方法是将<code>Q</code>对象直接放入<code>Calculations.objects.filter()</code>本身(而不是获取相关客户,然后找到相关计算)。在Django中,您可以查询<code>Q</code>对象中外键的属性。您首先获取客户,然后使用这些结果进行计算。这将增加对数据库的查询数量。你知道吗</p>
<p>您可以执行以下操作:</p>
<pre><code>calculations = Calculations.objects.filter(
Q(customer__email__icontains=search_term) |
Q(customer__chassis_icontains=search_term)|
Q(....)).select_related('customer')
</code></pre>
<p>相关链接:<br/>
1<a href="https://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships" rel="nofollow noreferrer">Lookups that span relationships</a><br/>
2<a href="https://docs.djangoproject.com/en/1.10/ref/models/querysets/#select-related" rel="nofollow noreferrer">^{<cd9>}</a></p>