Python 当Django呈现查询时,如何让它将我的浮点数视为浮点数而不是int?

Python 当Django呈现查询时,如何让它将我的浮点数视为浮点数而不是int?,python,sql,django,python-3.x,postgresql,Python,Sql,Django,Python 3.x,Postgresql,我在Postgres9.5中使用Python3.7和Django。我有以下Django查询 qset = DomainTrackerStat.objects.annotate( result=F('num_negative_articles') / (F('num_negative_articles') + F('num_positive_articles')) ).filter(subreddit=subreddit, domain=domain,

我在Postgres9.5中使用Python3.7和Django。我有以下Django查询

qset = DomainTrackerStat.objects.annotate(
    result=F('num_negative_articles') / (F('num_negative_articles') + F('num_positive_articles'))
).filter(subreddit=subreddit,
         domain=domain,
         num_negative_articles__gt=settings.DOMAIN_NEGATIVE_ARTICLES_THRESHOLD,
         result__gt=settings.DOMAIN_NEGATIVE_ARTICLES_PCT)
常量“settings.DOMAIN\u NEGATIVE\u ARTICLES\u PCT”为.95,但当呈现我的查询时,SQL显示为“0”。如果我将其设置为“settings.DOMAIN\u NEGATIVE\u ARTICLES\u PCT*100”,则查询将以“95”作为值呈现,但taht当然不是我想要的值

如何让Django将该值解释为一个浮点值——也就是我想要的正确值?

您应该使用一个,比如:

正如文件所说:

ExpressionWrapper
仅包围另一个表达式,并提供对其他表达式上可能不可用的属性(如
output\u field
)的访问
ExpressionWrapper
在不同类型的
F()
表达式上使用算术时是必需的,如中所述

您应该使用一个,例如:

正如文件所说:

ExpressionWrapper
仅包围另一个表达式,并提供对其他表达式上可能不可用的属性(如
output\u field
)的访问
ExpressionWrapper
在不同类型的
F()
表达式上使用算术时是必需的,如中所述


Thx,您的更改修复了“0”->“.95”问题,但还有另一个问题。当“F('num_negative_articles')/(F('num_negative_articles')+F('num_negative_articles')”重新命名为PostGres SQL--“myproject_domaintrackerstat.”num_negative_articles”/(“myproject_domaintrackerstat.”num negative_articles“+“myproject_domaintrackerstat.”num negative_articles”)时,taht表达式的计算值要么为“1”或“0”。它的计算结果不是应该的浮点值。@Dave:如果在其中一个操作数上应用
ExpressionWrapper
,该怎么办?所以在除名之前它已经是一个浮动了。是的,这是一条路要走。谢谢。顺便说一句,我对Python和Django框架相当陌生,但要得到一个简单的数学表达式,似乎需要做很多工作。@Dave:问题是,如果两个操作数都是整数,PostgreSQL将执行整数除法,所以您需要先将它们转换为浮点对应项。Thx,您的更改修复了“0”->“.95”问题,但仍然存在另一个问题。当“F('num_negative_articles')/(F('num_negative_articles')+F('num_negative_articles')”重新命名为PostGres SQL--“myproject_domaintrackerstat.”num_negative_articles”/(“myproject_domaintrackerstat.”num negative_articles“+“myproject_domaintrackerstat.”num negative_articles”)时,taht表达式的计算值要么为“1”或“0”。它的计算结果不是应该的浮点值。@Dave:如果在其中一个操作数上应用
ExpressionWrapper
,该怎么办?所以在除名之前它已经是一个浮动了。是的,这是一条路要走。谢谢。顺便说一句,我对Python和Django框架相当陌生,但要得到一个简单的数学表达式,这似乎需要做很多工作。@Dave:问题是,如果两个操作数都是整数,PostgreSQL将执行整数除法,所以需要先将它们转换为浮点对应数。
from django.db.models import ExpressionWrapper, F, FloatField

DomainTrackerStat.objects.annotate(
    result=ExpressionWrapper(
        F('num_negative_articles') / (F('num_negative_articles') + F('num_positive_articles')),
        output_field=FloatField()
    )
)
from django.db.models import F, FloatField
from django.db.models.functions import Cast

DomainTrackerStat.objects.annotate(
    result=Cast(F('num_negative_articles'), output_field=FloatField()) /
        Cast(F('num_negative_articles') + F('num_positive_articles'), output_field=FloatField())
)