使用Django在JSONField上进行SELECT

时间:2017-02-21 22:47:48

标签: python django postgresql django-jsonfield

我的应用程序严重依赖于API,这些API会无法预测地更改返回数据的方式。出于这个原因,我选择将PSQL和JSONField与Django一起使用 我已经看到很多关于如何通过JSONField中的值进行过滤的示例/文档,但我还没有看到任何允许我对这些值进行SELECT的内容。

我所知道的有用;
queryset.filter(jsonfield__key_name = 'value')

我想知道怎么做;
queryset.values('jsonfield__key_name')

提前致谢!

2 个答案:

答案 0 :(得分:3)

答案是RawSQL表达式;

queryset.annotate(value = RawSQL("(jsonfield->%s)", ('key_name',)))
queryset.values('value')

RawSQL的第一个参数就像一个模板字符串,第二个参数将填入第一个%s

更新:显然Django 2.1+现在支持我原来预期的行为;

queryset.values('jsonfield__key_name') 

答案 1 :(得分:1)

从Django 2.1开始,order_by()values()values_list()支持转换,因此您现在可以使用此功能:

queryset.values('jsonfield__key_name')

这里是相关的ticketpull request