Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 合并必须至少包含两个表达式_Django_Python 3.x_Model_Coalesce - Fatal编程技术网

Django 合并必须至少包含两个表达式

Django 合并必须至少包含两个表达式,django,python-3.x,model,coalesce,Django,Python 3.x,Model,Coalesce,我正在使用Django和Python 3.7。我想编写一个联合表达式来帮助我编写一个更大的Django查询。我有 Coalesce( F("votes") - Subquery(relevant_hour_stats.values('votes_threshold')[:1]), output_field=models.FloatField())

我正在使用Django和Python 3.7。我想编写一个联合表达式来帮助我编写一个更大的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()
据我所知,我有两种表达方式。该错误还可能指什么?

django术语中的“表达式”是
django.db.models.expressions.Expression的实例

F('voates')
-表达式

子查询(…)
-表达式也是

但是
expression+expression==组合表达式
因此
F(…)-Subquery(…)
是一个单一的“复杂”表达式

您需要的是用于合并的第二个位置参数:

合并(
(F(…)-子查询(相关的_hour_stats.values('vows_threshold')[:1]),#第一个表达式
值(0.0),#第二个表达式
output_field=models.FloatField()
)
我认为子查询可能会导致NULL(而不是
F()
),因此最好在合并中只包装子查询:

qset=(
物品统计
.all()
.注释(
移位文章创建小时=提取小时(
表达式包装器(
F(“文章创建时间”)+timedelta(秒=平均fp时间,以秒为单位),
输出\字段=models.DateTimeField()
)
),
)
.注释(
投票率高于阈值=(
#单个表达式F()-合并(…)用括号括起来
F(“投票”)-合并(
#2个表达式作为合并的参数:
子查询(相关的小时统计值('vows\u threshold')[:1]),
值(0.0),
output_field=models.FloatField(),
)
),
)
.过滤器(
票数高于阈值,票数gt=0,
)
)

这两个表达式是什么?