Как я могу заставить Django обрабатывать мой номер с плавающей точкой как число с плавающей точкой вместо int, когда он выполняет запрос? - PullRequest
1 голос
/ 15 июня 2019

Я использую Python 3.7 и Django с PostGres 9.5.У меня есть следующий запрос 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_NEGATIVE_ARTICLES_PCT" равна ".95", но когда мой запрос отображается, SQL отображается как "0".Если я сделаю это «settings.DOMAIN_NEGATIVE_ARTICLES_PCT * 100», запрос будет обработан с «95» в качестве значения, но, конечно, это не то значение, которое я хочу.

Как мне заставить Django интерпретировать значениекак поплавок - то есть правильное значение, для которого я иду?

1 Ответ

0 голосов
/ 15 июня 2019

Вы должны использовать ExpressionWrapper [Django-doc] , например:

from django.db.models import <b>ExpressionWrapper</b>, F, <b>FloatField</b>

DomainTrackerStat.objects.annotate(
    result=<b>ExpressionWrapper(</b>
        F('num_negative_articles') / (F('num_negative_articles') + F('num_positive_articles')),
        <b>output_field=FloatField()</b>
    <b>)</b>
)

Или для PostgreSql мы должны использовать оператор Cast(..) [Django-doc] для операндов:

from django.db.models import F, FloatField
from django.db.models.functions import <b>Cast</b>

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

Как сказано в документации:

ExpressionWrapper просто окружает другое выражение и предоставляет доступ к свойствам, таким как output_field, которые могут быть недоступны в других выражениях. ExpressionWrapper необходимо при использовании арифметики для F() выражений с различными типами , как описано в Использование F() с аннотациями .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...