PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Hitungan anotasi Django di JSONField dengan Postgres

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pengecualian khusus PostgreSQL?

  2. Masalah penyandian PostgreSQL saat menjalankan kueri dari baris perintah

  3. PILIH kolom dinamis tanpa fungsi di PostgreSQL

  4. Kesalahan sintaks tabel drop postgres

  5. Banyak-ke-Banyak Hubungan antara dua tabel dalam dua database yang berbeda