Django Postgres Json 过滤

问题描述 投票:0回答:1

有一个django模型Model。它有一个 JSONField 类型字段。 该模型的表中postgresql中大约有1000个json文件。 Json有严格的结构。 '食物' -> foodid -> '字段' -> 字段名称 -> {....}。可以有任意值来代替 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 字段。

python json django postgresql jsonb
1个回答
0
投票
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()

这将允许您高效地从 PostgreSQL 中的 JSON 字段检索唯一的(foodid、fieldname)对。如果您遇到任何问题或 JSON 结构略有不同,请告诉我,我将帮助您优化查询

© www.soinside.com 2019 - 2024. All rights reserved.