简体   繁体   English

使用Django在JSONField上进行选择

[英]SELECT on JSONField with Django

My application is heavily reliant on APIs that unpredictably make changes to the way they return data. 我的应用程序严重依赖API,这些API会意外地更改它们返回数据的方式。 For this reason, I've chosen to use PSQL and JSONFields with Django. 因此,我选择在Django中使用PSQL和JSONFields。
I've seen plenty of examples/docs on how to filter by values in a JSONField, but I haven't seen any that allow me to SELECT on these values. 我已经看到了很多有关如何按JSONField中的值进行过滤的示例/文档,但是我还没有看到任何允许我对这些值进行SELECT的示例/文档。

What I know works; 我所知道的有效;
queryset.filter(jsonfield__key_name = 'value')

What I want to know how to do; 我想知道怎么做;
queryset.values('jsonfield__key_name')

Thanks in advance! 提前致谢!

The answer is a RawSQL expression; 答案是RawSQL表达式。

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

The first argument to RawSQL is like a template string, the second argument will fill in the first's %s RawSQL的第一个参数就像一个模板字符串,第二个参数将填充第一个的%s

UPDATE: apparently Django 2.1+ now supports my original expected behavior; 更新:显然Django 2.1+现在支持我最初的预期行为;

queryset.values('jsonfield__key_name') 

Since Django 2.1, transforms are supported in order_by() , values() and values_list() , so you can now use this: 从Django 2.1开始, order_by()values()values_list() ,因此您现在可以使用以下代码:

queryset.values('jsonfield__key_name')

Here's the relevant ticket and pull request . 这是相关的出 请求

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM