SELECT 在 JSONField 上使用 Django
SELECT on JSONField with Django
我的应用程序严重依赖 API,这些 API 会不可预测地更改它们 return 数据的方式。出于这个原因,我选择在 Django 中使用 PSQL 和 JSONFields。
我已经看到很多关于如何按 JSONField 中的值进行过滤的 examples/docs,但我还没有看到任何允许我对这些值进行 SELECT 的内容。
我所知道的有用;
queryset.filter(jsonfield__key_name = 'value')
我想知道怎么做;
queryset.values('jsonfield__key_name')
提前致谢!
答案是一个RawSQL表达式;
queryset.annotate(value = RawSQL("(jsonfield->%s)", ('key_name',)))
queryset.values('value')
RawSQL
的第一个参数就像一个模板字符串,第二个参数将填充第一个的%s
更新:显然 Django 2.1+ 现在支持我原来的预期行为;
queryset.values('jsonfield__key_name')
自 Django 2.1 起,order_by()
、values()
和 values_list()
支持转换,因此您现在可以使用:
queryset.values('jsonfield__key_name')
这是相关的 ticket and pull request。
我的应用程序严重依赖 API,这些 API 会不可预测地更改它们 return 数据的方式。出于这个原因,我选择在 Django 中使用 PSQL 和 JSONFields。
我已经看到很多关于如何按 JSONField 中的值进行过滤的 examples/docs,但我还没有看到任何允许我对这些值进行 SELECT 的内容。
我所知道的有用;
queryset.filter(jsonfield__key_name = 'value')
我想知道怎么做;
queryset.values('jsonfield__key_name')
提前致谢!
答案是一个RawSQL表达式;
queryset.annotate(value = RawSQL("(jsonfield->%s)", ('key_name',)))
queryset.values('value')
RawSQL
的第一个参数就像一个模板字符串,第二个参数将填充第一个的%s
更新:显然 Django 2.1+ 现在支持我原来的预期行为;
queryset.values('jsonfield__key_name')
自 Django 2.1 起,order_by()
、values()
和 values_list()
支持转换,因此您现在可以使用:
queryset.values('jsonfield__key_name')
这是相关的 ticket and pull request。