Django Postgres Json Filtering

Имеется модель django Model. В ней есть поле типа JSONField. В таблице этой модели в postgresql хранится около 1000 json-файлов. Json имеет строгую структуру. 'food' -> foodid -> 'field' -> fieldname -> {....}. Вместо foodid и fieldname могут быть произвольные значения. Как получить из postgres уникальные возможные пары (foodid, fieldname)?

Model.objects.annotate(
 foodid=Func(
 F('food'),
 function='jsonb_object_keys',
 output_field=models.CharField()
 )
 ).annotate(
 field_name=Func(
 Value('food__') + F('foodid') + Value('__field'), 
 function='jsonb_object_keys',
 output_field=models.CharField()
 )
 ).values_list('food_id', 'field_names')

Первый аннотат работает. Во втором аннотате я хочу взять поле food_id из первого аннотата, но просто указав F('foodidid__field'), postgres будет искать поле foodid в самой таблице, которой не существует.

from django.db.models.expressions import RawSQL

Model.objects.annotate(
  foodid=RawSQL("jsonb_object_keys(food)", []),
  fieldname=RawSQL("jsonb_object_keys((food -> jsonb_object_keys(food)::text) -> 'field')", [])
).values('foodid', 'fieldname').distinct()

Это позволит вам эффективно извлекать уникальные пары (foodid, fieldname) из вашего JSON-поля в PostgreSQL. Если у вас возникнут проблемы или структура JSON немного изменится, дайте мне знать, и я помогу вам доработать запрос

Вернуться на верх