我有一个包含各种数据库模型字段的 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 作为浮点数返回,将其排序为浮点数并过滤它就好(如果我在 Postgres 的控制台中运行生成的 sql),生成的 Queryset 将值转换为整数,导致0s...(记住 CTR 不是模型字段)。
我怎样才能确保带注释的值以正确的数据类型加载到模型中?我可以设置保留类型的 DecimalField 或 FloatField 的非数据库模型字段吗?
任何想法将不胜感激!
谢谢哈雷尔
_