Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在Django中注释JSON字段?_Mysql_Django - Fatal编程技术网

Mysql 如何在Django中注释JSON字段?

Mysql 如何在Django中注释JSON字段?,mysql,django,Mysql,Django,我有一个这样的模型: 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') ) qs

我有一个这样的模型:

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')
     )
qs = MyModel.objects.filter(id__in=given_list).annotate(
         first_name=RawSQL("(details->%s)", ('first_name',)),
         last_name=RawSQL("(details->%s)", ('last_name',))
     )
我想对该模型中的一些字段进行如下注释:

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')
     )
qs = MyModel.objects.filter(id__in=given_list).annotate(
         first_name=RawSQL("(details->%s)", ('first_name',)),
         last_name=RawSQL("(details->%s)", ('last_name',))
     )
但是
F()
表达式没有考虑json键,它只返回details字段

我正在使用MySQL,因此无法使用
KeyTextTransform

我试着像这样使用RawSQL:

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')
     )
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.')

那么,我该怎么做才能使一切按预期运行呢?

您只需将属性添加到您的
MyModel
中,并让它们返回相应的信息即可

class MyModel(models.Model):
    details = models.JSONField()
    
    @property
    def first_name(self):
        return self.details['first_name']
    @property    
    def last_name(self):
        return self.details['last_name']

您只需将属性添加到您的
MyModel
,并让它们返回相应的信息即可

class MyModel(models.Model):
    details = models.JSONField()
    
    @property
    def first_name(self):
        return self.details['first_name']
    @property    
    def last_name(self):
        return self.details['last_name']
MySQL使用
jsonfield->“$.key”
有一种特殊的语法。试试这个:

qs = MyModel.objects.filter(id__in=given_list).annotate(
    first_name=RawSQL("(details->%s)", ('$.first_name',)),
    last_name=RawSQL("(details->%s)", ('$.last_name',))
)
MySQL使用
jsonfield->“$.key”
有一种特殊的语法。试试这个:

qs = MyModel.objects.filter(id__in=given_list).annotate(
    first_name=RawSQL("(details->%s)", ('$.first_name',)),
    last_name=RawSQL("(details->%s)", ('$.last_name',))
)

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

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

MySQLdb._exceptions.ProgrammingError:(1064,“您的SQL语法有错误;请检查与您的MySQL服务器版本对应的手册,以了解在“first_name”附近使用的语法是否正确)如
first_name
,((proxy_details->“$.”last_name”)如第1行的“last”)请立即尝试,我忘了django引用了paramsMySQLdb._exceptions.ProgrammingError:(1064,“您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以获得在“first_name”附近使用的正确语法)作为
first_name
,((proxy_details->“$.”last_name“”)作为第1行的“last”)立即尝试,我忘了django引用了params