さまざまなデータベース モデル フィールドを含む Django モデルがあります。マネージャーのクエリセットの 1 つは、いくつかの注釈呼び出しを介してさまざまな集計を取得します。これらの注釈の一部はカスタムメイドで、データベースから float 値を取得します。これらの注釈は、モデルのフィールドの一部ではありません。ただし、クエリセットが作成されると、これらの浮動小数点数はモデル内の整数であることがわかります。浮動小数点数または小数データ型にバインドするモデル フィールドがないためだと思います。
私が何を意味するかを説明するためのコードを次に示します。
カスタム集約クラス。データベースが結果を float にキャストすることに注意してください。
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 を float として返し、float としてソートし、適切にフィルタリングしますが (生成された SQL を Postgres のコンソールで実行すると)、結果の Queryset は値を整数に変換し、結果として0s... (CTR はモデル フィールドではないことに注意してください)。
注釈付きの値が正しいデータ型でモデルに読み込まれるようにするにはどうすればよいですか? タイプを保持する DecimalField または FloatField の非データベース モデル フィールドを設定できますか?
どんなアイデアでも大歓迎です!
ありがとう
ハレル