Django在json字段中注释特定键

时间:2017-02-08 13:42:56

标签: python json django postgresql django-queryset

我正在使用Django 1.9和Postgres 9.5。我的模型(MyModel)带有JSONFielddjango.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.

无论如何我能做到这一点吗?

2 个答案:

答案 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')