首页 > 解决方案 > 如何在 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.')

那么我该怎么做才能使一切按预期工作呢?

标签: mysqldjango

解决方案


您可以使用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')
     )

推荐阅读