Anda dapat menggunakan jsonb_extract_path_text melalui Func objek sebagai alternatif untuk transformasi bidang:
Pet.annotate(dinner=Func(
F('data'), Value('diet'), Value('dinner'),
function='jsonb_extract_path_text')) \
.values('dinner') \
.annotate(total=Count('dinner'))
Alasan mengapa bidang mengubah data__diet__dinner
gagal adalah kesalahan dalam Django ketika Anda masuk lebih dalam dari hanya satu tingkat ke dalam struktur json dan gunakan GROUP BY
dalam SQL. Tingkat pertama (name
, animal
, diet
) seharusnya berfungsi dengan baik.
Alasannya tampaknya bahwa untuk transformasi bersarang, Django mengubah sintaks SQL yang digunakan, beralih dari satu nilai ke daftar untuk menentukan jalur ke dalam struktur json.
Ini adalah sintaks yang digunakan untuk transformasi json non-bersarang (=tingkat pertama):
"appname_pet"."data" -> 'diet'
Dan ini adalah sintaks yang digunakan untuk transformasi bersarang (lebih dalam dari level pertama):
"appname_pet"."data" #> ARRAY['diet', 'dinner']
Saat membangun kueri, Django tersedak pada daftar itu saat mengerjakan GROUP BY
yang diperlukan klausa. Ini tampaknya bukan pembatasan yang tak terelakkan; dukungan untuk transformasi cukup baru, dan ini mungkin salah satu kelemahan yang belum terselesaikan. Jadi jika Anda membuka tiket Django
, ini mungkin hanya bekerja beberapa versi di telepon.