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 немного изменится, дайте мне знать, и я помогу вам доработать запрос