有一个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 字段。
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 结构略有不同,请告诉我,我将帮助您优化查询