我正在使用Django 1.9和Postgres 9.5。我的模型(MyModel
)带有JSONField
(django.contrib.postgres.fields
)。 JSON值在模型中的所有对象中具有相同的结构。
{
"key1": int_val_1,
"key2": int_val_2
}
我想通过JSONField
中指定键的值来命令我的查询集。像
MyModel.objects.annotate(val=F('jsonfield__key1')).order_by('val')
这不起作用 - 我收到以下错误
Cannot resolve keyword 'key1' into field. Join on 'jsonfield' not permitted.
无论如何我能做到这一点吗?
答案 0 :(得分:9)
对于Django> = 1.11,您可以使用:
from django.contrib.postgres.fields.jsonb import KeyTextTransform
MyModel.objects.annotate(val=KeyTextTransform('key1', 'jsonfield')).order_by('val')
答案 1 :(得分:1)
此问题的更新答案:
在撰写本文时(Django 3.1),您现在可以完全按照您的希望进行排序,而无需任何辅助函数:
MyModel.objects.order_by('jsonfield__key1')