合并必须至少采用两个表达式
Coalesce must take at least two expressions
我正在使用 Django 和 Python 3.7。我想编写一个 Coalesce 表达式来帮助我编写一个更大的 Django 查询。我有
Coalesce(
F("votes")
-
Subquery(relevant_hour_stats.values('votes_threshold')[:1]),
output_field=models.FloatField())
这是上下文中的表达式...
qset = (
ArticleStat.objects
.all()
.annotate(
shifted_article_create_hour=ExtractHour(ExpressionWrapper(
F('article__created_on')
+
timedelta(seconds=avg_fp_time_in_seconds),
output_field=models.DateTimeField()
))
)
.annotate(
votes_above_threshold=(
Coalesce(
F("votes")
-
Subquery(relevant_hour_stats.values('votes_threshold')[:1]),
output_field=models.FloatField())
),
)
.filter(
votes_above_threshold__gt=0,
)
)
但这会导致
Coalesce must take at least two expressions
抱怨线路
output_field=models.FloatField()
据我所知,我有两种表达方式。错误还指的是什么?
"Expression" 在 django 的术语中是 django.db.models.expressions.Expression
的实例。
F('votes')
— 表达式。
Subquery(...)
— 也是表达。
但是 expression+expression == combined_expression
所以 F(...) - Subquery(...)
是一个单一的 "complex" 表达式。
您需要的是 Coalesce 的第二个 POSITIONAL 参数:
Coalesce(
(F(...) - Subquery(relevant_hour_stats.values('votes_threshold')[:1])), # First expression
Value(0.0), # Second expression
output_field=models.FloatField()
)
而且我认为子查询可能会导致 NULL(而不是 F()
),因此最好在 Coalesce 中仅包装子查询:
qset = (
ArticleStat.objects
.all()
.annotate(
shifted_article_create_hour=ExtractHour(
ExpressionWrapper(
F('article__created_on') + timedelta(seconds=avg_fp_time_in_seconds),
output_field=models.DateTimeField()
)
),
)
.annotate(
votes_above_threshold=(
# Single expression F()-Coalesce(...) wrapped in parenthesis
F("votes") - Coalesce(
# 2 expressions as arguments to Coalesce:
Subquery(relevant_hour_stats.values('votes_threshold')[:1]),
Value(0.0),
output_field=models.FloatField(),
)
),
)
.filter(
votes_above_threshold__gt=0,
)
)
我正在使用 Django 和 Python 3.7。我想编写一个 Coalesce 表达式来帮助我编写一个更大的 Django 查询。我有
Coalesce(
F("votes")
-
Subquery(relevant_hour_stats.values('votes_threshold')[:1]),
output_field=models.FloatField())
这是上下文中的表达式...
qset = (
ArticleStat.objects
.all()
.annotate(
shifted_article_create_hour=ExtractHour(ExpressionWrapper(
F('article__created_on')
+
timedelta(seconds=avg_fp_time_in_seconds),
output_field=models.DateTimeField()
))
)
.annotate(
votes_above_threshold=(
Coalesce(
F("votes")
-
Subquery(relevant_hour_stats.values('votes_threshold')[:1]),
output_field=models.FloatField())
),
)
.filter(
votes_above_threshold__gt=0,
)
)
但这会导致
Coalesce must take at least two expressions
抱怨线路
output_field=models.FloatField()
据我所知,我有两种表达方式。错误还指的是什么?
"Expression" 在 django 的术语中是 django.db.models.expressions.Expression
的实例。
F('votes')
— 表达式。
Subquery(...)
— 也是表达。
但是 expression+expression == combined_expression
所以 F(...) - Subquery(...)
是一个单一的 "complex" 表达式。
您需要的是 Coalesce 的第二个 POSITIONAL 参数:
Coalesce(
(F(...) - Subquery(relevant_hour_stats.values('votes_threshold')[:1])), # First expression
Value(0.0), # Second expression
output_field=models.FloatField()
)
而且我认为子查询可能会导致 NULL(而不是 F()
),因此最好在 Coalesce 中仅包装子查询:
qset = (
ArticleStat.objects
.all()
.annotate(
shifted_article_create_hour=ExtractHour(
ExpressionWrapper(
F('article__created_on') + timedelta(seconds=avg_fp_time_in_seconds),
output_field=models.DateTimeField()
)
),
)
.annotate(
votes_above_threshold=(
# Single expression F()-Coalesce(...) wrapped in parenthesis
F("votes") - Coalesce(
# 2 expressions as arguments to Coalesce:
Subquery(relevant_hour_stats.values('votes_threshold')[:1]),
Value(0.0),
output_field=models.FloatField(),
)
),
)
.filter(
votes_above_threshold__gt=0,
)
)