如何使用 keyTextTransform() 进行嵌套 json?

Joh*_*rtl 7 django postgresql json

我的模型有一个 json 字段。我可以使用以下查询访问 jsonfield['key1']

from django.contrib.postgres.fields.jsonb import KeyTextTransform
MyModel.objects.annotate(val=KeyTextTransform('key1', 'jsonfield')).order_by('val')
Run Code Online (Sandbox Code Playgroud)

但是我如何访问像 jsonfield['key1']['key2'] 这样的键甚至更多嵌套的键?

这不可能是唯一的解决方案,对吗?

MyModel.objects.annotate(val=KeyTextTransform('key2', (KeyTextTransform('key1', 'jsonfield'))).order_by('val')
Run Code Online (Sandbox Code Playgroud)

Dra*_*obZ 8

谢天谢地,最困难的部分已经完成了。KeyTextTransform是可组合的。我们所要做的就是编写它。

class NestableKeyTextTransform:
    def __new__(cls, field, *path):
        if not path:
            raise ValueError("Path must contain at least one key.")
        head, *tail = path
        field = KeyTextTransform(head, field)
        for head in tail:
            field = KeyTextTransform(head, field)
        return field


MyModel.objects.annotate(
    single_nested_value=NestableKeyTextTransform(
      "json_field", "query", "name"
    ),
    array_access=NestableKeyTextTransform(
      "json_field", "query", "address_line", 1
    ),
)

Run Code Online (Sandbox Code Playgroud)

尽管我想指出这可能是更好的方法:

from django.db.models import F

MyModel.objects.annotate(
    single_nested_value=F("json_field__query__name"),
    array_access=F("json_field__query__address_line__1"),
)
Run Code Online (Sandbox Code Playgroud)