mysql - 如何在 Django 中注释 JSON 字段?
问题描述
我有一个这样的模型:
class MyModel(models.Model):
details = models.JSONField()
# other fields
我想从这个模型中注释一些字段,如下所示:
qs = MyModel.objects.filter(id__in=given_list).annotate(
first_name=F('details__first_name'),
last_name=F('details__last_name')
)
但是该F()
表达式不考虑 json 键,它只返回详细信息字段。
我正在使用 MySQL,所以不能使用KeyTextTransform
.
我尝试像这样使用 RawSQL:
qs = MyModel.objects.filter(id__in=given_list).annotate(
first_name=RawSQL("(details->%s)", ('first_name',)),
last_name=RawSQL("(details->%s)", ('last_name',))
)
但它给出了这个错误:
MySQLdb._exceptions.OperationalError: (3143, 'Invalid JSON path expression. The error is around character position 1.')
那么我该怎么做才能使一切按预期工作呢?
解决方案
您可以使用JSONExtract
,它会更容易编写和理解:
from django_mysql.models.functions import JSONExtract
qs = MyModel.objects.filter(id__in=given_list).annotate(
first_name=JSONExtract('details', '$.first_name'),
last_name=JSONExtract('details', '$.last_name')
)
推荐阅读
- ios - 与 iOS 中的 Web 相比,为什么在移动设备中获取的数据更少
- python - 在 Python 中,如何让扩展类元素显示在自动完成中?
- types - 如何将 type_info 转换为 Objective-c 的“类”类型
- asp.net - Rest API - 部分更新
- git - Git - 作者的 rebase 提交
- r - Scale_y_continous 不需要离散值
- java - 在智能合约中获取交易创建者的身份?
- javascript - redux-saga:在令牌刷新后重试捕获的动作
- ios - 使用 twitter 登录总是返回错误
- html - Angular 4:如何在输入列表中使用模式