AS @WillemVanOnsem указал:
Используйте OuterRef, когда набор запросов в подзапросе должен ссылаться на поле из внешнего запроса .Он действует как выражение F, за исключением того, что проверка того, ссылается ли оно на допустимое поле, не выполняется до тех пор, пока не будет разрешен внешний набор запросов.
И затем вы сделали:
query = StatByHour.objects.filter(hour_of_day=OuterRef(hour_filter))
, где hour_filter
рассматривается как поиск поля, а Django выполняет своего рода
hour_filter.split('__')
, чтобы собрать части ожидаемого поиска поля.
Но hour_filter
здесь ExtractHour
, отсюда и ошибка.
Вы можете попытаться аннотировать статистику ваших статей в нужный час, а затем поработать над результатом:
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.
)
Все можетвыглядит (я не проверял это, это просто попытка указать правильное направление):
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
)
Приложение:
Если вы все еще хотитечтобы использовать здесь подзапрос, вы можете изменить уже существующий подзапрос, чтобы он работал в аннотированном поле:
query = StatByHour.objects.filter(hour_of_day=OuterRef('hour'))
Gook luck!