<h3>使用内部连接求解</h3>
<p>如果您只能使用包含相应的<code>restProdAPI</code><em>的<code>restProdAPI</code><em>(根据join语句->;通过主机或ip链接)</em>。您可以尝试以下操作:</p>
<pre><code>soapProdAPI.objects.extra(
select = {
'rest_id' : "app_restProdAPI.rest_id",
'rest_host' : "app_restProdAPI.rest_host",
'rest_ip' : "app_restProdAPI.rest_ip",
'rest_mode' : "app_restProdAPI.rest_mode",
'rest_state': "app_restProdAPI.rest_state"
},
tables = ["app_restProdAPI"],
where = ["app_restProdAPI.rest_host = app_soapProdAPI.soap_host \
OR app_restProdAPI.rest_ip = app_soapProdAPI.soap_ip"]
)
</code></pre>
<p><strong>如何过滤更多?</strong></p>
<p>由于我们使用的是<a href="https://docs.djangoproject.com/en/1.8/ref/models/querysets/#extra" rel="nofollow">^{<cd3>}</a>,我建议您仔细阅读文档。一般来说,我们不能将<code>.filter</code>用于<code>select</code>dict中的某些字段,因为它们不是<code>soapProdAPI</code>的一部分,Django无法解析它们。我们必须坚持使用<code>where</code><code>kwarg</code>中的<code>.extra</code>,因为它是一个列表,所以我们最好再添加一个元素。在</p>
^{pr2}$
<h3>重复子查询</h3>
<p>如果你真的需要所有的<code>soapProdAPI's</code>,不管它们是否有对应的<code>restProdAPI</code>,我只能想到一个丑陋的例子,其中对你需要的每个字段重复一个<code>subquery</code>。在</p>
<pre><code>soapProdAPI.objects.extra(
select = {
'rest_id' : "(select rest_id from app_restProdAPI where app_restProdAPI.rest_host = app_soapProdAPI.soap_host OR app_restProdAPI.rest_ip = app_soapProdAPI.soap_ip)",
'rest_host' : "(select rest_host from app_restProdAPI where app_restProdAPI.rest_host = app_soapProdAPI.soap_host OR app_restProdAPI.rest_ip = app_soapProdAPI.soap_ip)",
'rest_ip' : "(select rest_ip from app_restProdAPI where app_restProdAPI.rest_host = app_soapProdAPI.soap_host OR app_restProdAPI.rest_ip = app_soapProdAPI.soap_ip)",
'rest_mode' : "(select rest_mode from app_restProdAPI where app_restProdAPI.rest_host = app_soapProdAPI.soap_host OR app_restProdAPI.rest_ip = app_soapProdAPI.soap_ip)",
'rest_state': "(select rest_state from app_restProdAPI where app_restProdAPI.rest_host = app_soapProdAPI.soap_host OR app_restProdAPI.rest_ip = app_soapProdAPI.soap_ip)"
},
)
</code></pre>