<p>正如@WillemVanOnsem所指出的:</p>
<blockquote>
<p><strong>Use OuterRef when a queryset in a Subquery needs to refer to a field from the outer query</strong>. It acts like an F expression except that the check to see if it refers to a valid field isn’t made until the outer queryset is resolved.</p>
</blockquote>
<p>然后你做到了:</p>
<pre><code>query = StatByHour.objects.filter(hour_of_day=OuterRef(hour_filter))
</code></pre>
<p>其中<code>hour_filter</code>被视为字段查找,Django正在执行一种</p>
^{pr2}$
<p>以收集预期字段查找的部分。在</p>
<p>但是<code>hour_filter</code>在这里是一个<code>ExtractHour</code>,因此出现了错误。在</p>
<p>您可以尝试用所需的小时对文章统计信息进行注释,然后处理结果:</p>
<pre><code> hour_value = ExtractHour(
ExpressionWrapper(
F("article__created_on") + timedelta(0, avg_fp_time_in_seconds),
output_field=models.DateTimeField()
),
)
qset = ArticleStat.objects.annotate(
hour = hour_value
).filter(
# ... and write your filter based on the annotate field (hour) here.
)
</code></pre>
<p>整个过程可能看起来像(我没有测试过这个,只是为了给你指出正确的方向):</p>
<pre><code>hour_value = ExtractHour(
ExpressionWrapper(
F("article__created_on") + timedelta(0, avg_fp_time_in_seconds),
output_field=models.DateTimeField()
),
)
qset = ArticleStat.objects.annotate(
hour = hour_value
).filter(
votes__gte=F("article__website__stats__total_score") /
F("article__website__stats__num_articles") *
F("hour") * day_of_week_index
)
</code></pre>
<p><strong>附录:</strong></p>
<p>如果仍要在此处使用子查询,可以修改已有的子查询,使其在带注释的字段上工作:</p>
<pre><code>query = StatByHour.objects.filter(hour_of_day=OuterRef('hour'))
</code></pre>
<p>祝你好运!在</p>