PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Django số lượng chú thích trong JSONField với Postgres

Bạn có thể sử dụng jsonb_extract_path_text qua Func đối tượng thay thế cho chuyển đổi trường:

Pet.annotate(dinner=Func(
    F('data'), Value('diet'), Value('dinner'),
    function='jsonb_extract_path_text'))  \
.values('dinner')  \
.annotate(total=Count('dinner'))

Lý do tại sao chuyển đổi trường data__diet__dinner không thành công là một lỗi trong Django khi bạn đi sâu hơn chỉ một cấp vào cấu trúc json sử dụng GROUP BY trong SQL. Cấp độ đầu tiên (name , animal , diet ) sẽ hoạt động tốt.

Lý do dường như là đối với các phép biến đổi lồng nhau, Django thay đổi cú pháp SQL được sử dụng, chuyển từ một giá trị duy nhất sang một danh sách để chỉ định đường dẫn vào cấu trúc json.

Đây là cú pháp được sử dụng cho các phép biến đổi json không lồng nhau (=mức đầu tiên):

"appname_pet"."data" -> 'diet'

Và đây là cú pháp được sử dụng cho các phép biến đổi lồng nhau (sâu hơn mức đầu tiên):

"appname_pet"."data" #> ARRAY['diet', 'dinner']

Trong khi xây dựng truy vấn, Django mắc kẹt trên danh sách đó trong khi giải quyết GROUP BY bắt buộc điều khoản. Đây dường như không phải là một hạn chế không thể tránh khỏi; hỗ trợ cho các phép chuyển đổi còn khá mới và đây có thể là một trong những điểm khó khăn vẫn chưa được giải quyết. Vì vậy, nếu bạn mở vé Django , điều này có thể chỉ hoạt động với một vài phiên bản sau.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chọn các hàng không có trong bảng khác

  2. thay đổi cơ sở dữ liệu (postgresql) trong python bằng cách sử dụng psycopg2 động

  3. Làm cách nào để khôi phục dữ liệu từ vùng chứa Docker đã bị xóa? Làm thế nào để kết nối lại nó với dữ liệu?

  4. Thả ràng buộc theo tên trong Postgresql

  5. Tổng hợp postgres SQL / tổng hợp dữ liệu theo tuần với tổng số