У меня есть модель Django, содержащая различные поля модели базы данных.Один из наборов запросов менеджера извлекает различные агрегаты с помощью некоторых аннотированных вызовов.Некоторые из этих аннотаций сделаны на заказ и извлекают значения с плавающей точкой из базы данных.Эти аннотации не являются частью полей модели.Однако когда создается набор запросов, эти числа с плавающей точкой оказываются целыми числами в модели, я полагаю, потому что нет поля модели, которое связывало бы их с типом данных с плавающей запятой или десятичным типом.
Вот некоторый код для демонстрациичто я имею в виду:
Пользовательские агрегатные классы.Обратите внимание, что база данных преобразует результат в число с плавающей запятой:
class SqlCTR(aggregates.Sum):
is_ordinal = True
sql_function = 'SUM'
sql_template= "CASE WHEN sum(campaignmanager_adstats.impressions) > 0 THEN sum(campaignmanager_adstats.clicks)/sum(campaignmanager_adstats.impressions)::float ELSE 0::float END"
class CTR(Sum):
name='CTR'
def add_to_query(self, query, alias, col, source, is_summary):
aggregate = SqlCTR(col, source=source, is_summary=is_summary)
query.aggregates[alias] = aggregate
А вот набор запросов:
camps = self.select_related(depth=3).\
annotate( impressions=Sum('ad__adstats__impressions'),\
clicks=Sum('ad__adstats__clicks'),\
ctr=CTR('ad__adstats__clicks'),\
exclude(**campaignExclude).\
filter(**campaignArgs).order_by(sortBy)
Проблема в том, что, хотя сам запрос выполняется нормально и возвращает CTR в виде чисел с плавающей запятой, сортируетэто как число с плавающей запятой и просто его фильтрует (если я запускаю сгенерированный sql в консоли Postgres), результирующий набор Queryset преобразует значение в целое число, что приводит к нулю ... (Помните, CTR не является полем модели).
Как я могу убедиться, что аннотированные значения загружаются в свой правильный тип данных для модели?Могу ли я установить поле не для модели базы данных DecimalField или FloatField, которое сохранит тип?
Любая идея будет высоко оценена!
Спасибо
Harel