JSONField上的Django Queryset带有嵌套数据,因此字典键的键名中有一个连字符

2024-09-30 08:18:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为“data”的jsonfield,其中一行包含以下内容,我正在试验QuerySet:

{
  "id": "5cfbffb4-c03a-4905-aa3c-8ecd878f56d7",
  "owner": "string",
  "name": "some string",
  "short-name": "some string",
  "description": "some description",
  "sub-identifier": [{
    "sub_id": "d2610379-abcc-4201-ad89-5f3ad3a4b1c2",
    "sub_name": "Test Dummy1",
    "sub-short-name": "some further name",
    "sub_description": "some description"
  }, {
    "sub_id": "7461b531-a181-483d-a554-ab8761c1d672",
    "sub_name": "Test Dummy2",
    "sub-short-name": "some further name",
    "sub_description": "some description"
  }]
}

所以我可以创建一个新的查询集

queryset = TestModel.objects.filter(data__name='some string')

这将正确返回查询集结果。但是,我注意到,如果dictionary键中有一个连字符,那么它会给我一个错误。下面返回一个语法错误:

queryset = TestModel.objects.filter(data__sub-identifier__sub_id__0='d2610379-abcc-4201-ad89-5f3ad3a4b1c2')

SyntaxError:表达式不能包含赋值,可能您的意思是“==”

有没有办法告诉Django接受可能带有连字符的键名?还是我必须确保在json数据中所有键都使用下划线

此外,我可以在子标识符内循环遍历列表中的每个元素,以测试子标识符中我要查找的数字。当然,我可以像上面那样使用0来实现这一点,但希望有一种方法可以在sub-identifer中循环遍历字典列表中的每个元素

谢谢


Tags: nametestiddatastringsomedescriptionqueryset
2条回答

出现错误是因为(您自己可能知道)标识符中不允许使用连字符-。如何解决这个问题?我们有一个很好的功能,通过字典解包传递kwargs,所以你可以写下:

# 0 should be before sub_id here
queryset = TestModel.objects.filter(**{'data__sub-identifier__0__sub_id': 'd2610379-abcc-4201-ad89-5f3ad3a4b1c2'})

接下来,由于要检查数组中的任何匹配项,因此可以使用^{} lookup [Django docs]

queryset = TestModel.objects.filter(
    **{
        'data__sub-identifier__contains': [
            {'sub_id': 'd2610379-abcc-4201-ad89-5f3ad3a4b1c2'}
        ]
    }
)

试着改变这个

queryset = TestModel.objects.filter(data__sub-identifier__sub_id__0='d2610379-abcc-4201-ad89-5f3ad3a4b1c2')
#                                            ^

对此

queryset = TestModel.objects.filter(data__sub_identifier__sub_id__0='d2610379-abcc-4201-ad89-5f3ad3a4b1c2')
#                                            ^

并更新模型以使用适当的命名约定

请使用不带符号的名称,这些符号肯定会破坏ORM,甚至在SQL查询中也无法使用名称(-在SQL中是为替换运算符保留的,在python中也是如此)

相关问题 更多 >

    热门问题