Python 当Django呈现查询时,如何让它将我的浮点数视为浮点数而不是int?
我在Postgres9.5中使用Python3.7和Django。我有以下Django查询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,
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())
)