jsonb_extract_path_text を使用できます 機能 経由 フィールド変換の代替としてのオブジェクト:
Pet.annotate(dinner=Func(
F('data'), Value('diet'), Value('dinner'),
function='jsonb_extract_path_text')) \
.values('dinner') \
.annotate(total=Count('dinner'))
フィールドがdata__diet__dinner
を変換する理由 失敗は、json構造の1レベルよりも深くなると、Django内のエラーになります GROUP BY
を使用します SQLで。最初のレベル(name
、animal
、diet
)正常に動作するはずです。
その理由は、ネストされた変換の場合、Djangoが使用されるSQL構文を変更し、単一の値からリストに切り替えて、json構造へのパスを指定するためと思われます。
これは、ネストされていないjson変換(=第1レベル)に使用される構文です:
"appname_pet"."data" -> 'diet'
そして、これはネストされた変換(第1レベルよりも深い)に使用される構文です:
"appname_pet"."data" #> ARRAY['diet', 'dinner']
クエリを作成している間、Djangoは必要なGROUP BY
を実行している間、そのリストをチョークします。 条項。これは避けられない制限ではないようです。変換のサポートは非常に新しく、これはおそらくまだ解決されていない問題の1つです。したがって、Djangoチケット
を開くと 、これは将来的にはいくつかのバージョンで機能する可能性があります。