json - 如何将 keyTextTransform() 用于嵌套 json?
问题描述
我的模型有一个 json 字段。我可以使用以下查询访问 jsonfield['key1']
from django.contrib.postgres.fields.jsonb import KeyTextTransform
MyModel.objects.annotate(val=KeyTextTransform('key1', 'jsonfield')).order_by('val')
但是如何访问像 jsonfield['key1']['key2'] 甚至更多嵌套的键?
这不可能是唯一的解决方案,对吧?
MyModel.objects.annotate(val=KeyTextTransform('key2', (KeyTextTransform('key1', 'jsonfield'))).order_by('val')
解决方案
谢天谢地,困难的部分已经完成。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
),
)
尽管我想指出这可能是一种更好的方法:
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"),
)
推荐阅读
- ios - Swift:使用collectionView创建imageView堆栈
- python - python中的复杂列表(作业)
- apache-kafka - 如何检查 Kafka 服务器状态或详细信息?
- java - 如何在 Java 中的方法中设置超时并在一段时间内重试方法
- ios - 如何知道试用版在 iOS 应用中可用
- android - 错误 NativeScript - 显示空应用程序而不是内容
- ios - 在 iOS 应用程序中通过 Share Extension 与群组共享图像。不使用图像数据
- php - 字典顺序 nk 中的下一个排列
- excel - 如何使用 SAS 将 2 个数据集导出到 excel“Sheet1”和另一组 2 个数据集到“Sheet2”
- reactjs - 如何使用组件创建联合类型?