我有一个名为"data“的jsonfield,其中一行包含以下内容,并且我正在尝试使用querysets:
{
"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')
这会正确地返回我的查询集结果。但是,我注意到,如果字典键中有连字符,那么它会给我一个错误。下面返回一个语法错误:
queryset = TestModel.objects.filter(data__sub-identifier__sub_id__0='d2610379-abcc-4201-ad89-5f3ad3a4b1c2')
SyntaxError:表达式不能包含赋值,也许您的意思是"=="?
有没有办法告诉Django接受可能包含连字符的键名?或者我必须确保在我的json数据中所有的键都使用下划线?
此外,我是否可以遍历列表中的每个元素在子标识符内测试我正在查找的数字的sub_id。当然,我可以像上面一样使用0来做这件事,但希望有一种方法可以循环遍历sub-identifer中的字典列表中的每个元素。
谢谢
发布于 2021-04-26 12:06:39
您得到这个错误是因为(正如您自己可能知道的)标识符中不允许使用连字符-
。如何解决这个问题?我们有一个很好的特性,可以通过字典解包来传递kwargs,所以你可以这样写:
# 0 should be before sub_id here
queryset = TestModel.objects.filter(**{'data__sub-identifier__0__sub_id': 'd2610379-abcc-4201-ad89-5f3ad3a4b1c2'})
接下来,由于您希望检查数组中的任何匹配项,因此可以使用contains
lookup [Django docs]
queryset = TestModel.objects.filter(
**{
'data__sub-identifier__contains': [
{'sub_id': 'd2610379-abcc-4201-ad89-5f3ad3a4b1c2'}
]
}
)
发布于 2021-04-26 11:30:29
尝试更改此设置
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中也是如此)。
https://stackoverflow.com/questions/67265654
复制相似问题