社区首页 >问答首页 >包含嵌套数据的JSONField上的Django查询集,因此字典键在键名中有连字符

包含嵌套数据的JSONField上的Django查询集,因此字典键在键名中有连字符
EN

Stack Overflow用户
提问于 2021-04-26 11:16:16
回答 2查看 60关注 0票数 1

我有一个名为"data“的jsonfield,其中一行包含以下内容,并且我正在尝试使用querysets:

代码语言:javascript
代码运行次数:0
复制
{
  "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"
  }]
}

这样我就可以创建一个新的查询集

代码语言:javascript
代码运行次数:0
复制
queryset = TestModel.objects.filter(data__name='some string')

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

代码语言:javascript
代码运行次数:0
复制
queryset = TestModel.objects.filter(data__sub-identifier__sub_id__0='d2610379-abcc-4201-ad89-5f3ad3a4b1c2')

SyntaxError:表达式不能包含赋值,也许您的意思是"=="?

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

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

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-26 12:06:39

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

代码语言:javascript
代码运行次数:0
复制
# 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]

代码语言:javascript
代码运行次数:0
复制
queryset = TestModel.objects.filter(
    **{
        'data__sub-identifier__contains': [
            {'sub_id': 'd2610379-abcc-4201-ad89-5f3ad3a4b1c2'}
        ]
    }
)
票数 0
EN

Stack Overflow用户

发布于 2021-04-26 11:30:29

尝试更改此设置

代码语言:javascript
代码运行次数:0
复制
queryset = TestModel.objects.filter(data__sub-identifier__sub_id__0='d2610379-abcc-4201-ad89-5f3ad3a4b1c2')
#                                            ^

到这个

代码语言:javascript
代码运行次数:0
复制
queryset = TestModel.objects.filter(data__sub_identifier__sub_id__0='d2610379-abcc-4201-ad89-5f3ad3a4b1c2')
#                                            ^

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

请使用不带符号的名称,这肯定会破坏ORM,并使名称即使在SQL查询中也无法使用( SQL中的-是为替换操作符保留的,在python中也是如此)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67265654

复制
相关文章
文档片段(createDocumentFragment)
1.createDocumentFragment var one = document.getElementById("one"); var k = document.createDocumentFragment(); var p = document.createElement("p"); p.innerHTML = "我们不一样"; k.appendChild(p); one.appendChild(k) console.log(k) //文档里没
天天_哥
2018/09/29
5220
[linux][c/c++]代码片段01
#include <stdio.h> #include <unistd.h> void usage() { printf("Usage:\n"); printf("\tOptDemo [-a] [-b] [-c message]"); } int main(int argc, char *argv[]) { int o; const char *optstring = "abc::"; // 有三个选项-abc,其中c选项后有两个冒号,表示后面可选参数 whi
landv
2019/11/10
6760
[linux][c/c++]代码片段02
 gcc `pkg-config --cflags gtk+-3.0` -o example-1 example-1.c `pkg-config --libs gtk+-3.0`
landv
2019/11/11
4970
[linux][c/c++]代码片段02
php代码片段
获取文件后缀
lilugirl
2019/05/26
4K0
Vue.js 中的片段
为了使诸如屏幕阅读器之类的辅助技术能够解释网页和应用程序,无障碍支持是必需的。为了使这些技术起作用,开发人员需要考虑可访问性。
疯狂的技术宅
2020/01/14
2.7K0
Vue.js 中的片段
实战:从 Redux 中的代码片段中应用柯里化!
本文通译自:JavaScript Currying: A Practical Example
掘金安东尼
2022/09/19
9840
MarkDown常用代码片段和工具
markdwon可以支持Html代码,所以很多原生markdown没有的功能,就可以用Html写了。
sean.liu
2022/08/03
3150
HTML代码片段
IE条件注释 <!--[ifIE6]> IE6版本有效 <![endif]--> <!--[if gt IE6]> IE6以上版本有效 <![endif]--> <!--[if gte IE6]> IE6(包含)及以上版本有效 <![endif]--> <!--[if lt IE8]> IE8以下版本有效 <![endif]--> <!--[if lte IE8]> IE8(包含)及以下版本有效 <![endif]--> <!--[if !IE]>--> 除了IE <![endif]--> 用Chrome或
前端GoGoGo
2018/08/27
5.3K0
VSCode 添加用户代码片段,自定义用户代码片段
在使用 VScode 开发中经常会有一些重复使用的代码块,复制粘贴也很麻烦,这时可以在 VScode 中添加用户代码片段,输入简写即可快捷输入。
Cell
2023/09/15
1K0
VSCode 添加用户代码片段,自定义用户代码片段
CSS代码片段
见 https://css-tricks.com/snippets/css/media-queries-for-standard-devices/
前端GoGoGo
2018/08/27
9080
Spring代码片段
配置springmvc核心控制器DispatcherServlet web.xml
小锋学长生活大爆炸
2020/11/24
6640
Spring代码片段
1049. 数列的片段和(20)
给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段。例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.3) (0.3, 0.4) (0.4) 这10个片段。
AI那点小事
2020/04/20
3290
1049. 数列的片段和(20)
【PAT乙级】数列的片段和
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
喜欢ctrl的cxk
2019/11/08
4020
nodejs常用代码片段
调用:node index.js --target test 接收:const config=loadConifg(['target'],'--') //config.target----->test
易墨
2018/09/14
8840
Shell脚本常用片段
shell脚本时不时就要用到,但是一些常用的片段却没有记住,这里整理一个笔记 常用片段 普通 文件所在目录 CUR_DIR="$(dirname $0)" 基本每个脚本都要用到,否则脚本执行的时候就容易受到当前目录的影响,可能出现执行结果不一致 if-elif-fi if condition; then commands; elif condition; then commands; fi 时间相关 当前时间 date +%Y%m%d%H%M%S 纪元秒 # 纪元秒,方便用来实现
十毛
2019/03/27
8560
Python 代码片段总结
生成的pyc可以跨平台使用,但是只能这样用python xxx.pyc,而不能使用./xxx.pyc执行,因为缺少了shebang的支持,不过貌似Binfmt_misc可以解决这个问题,ubuntu下apt-get install binfmt-support可以直接安装。
老高的技术博客
2022/12/28
6120
Python 代码片段总结
Lua代码片段收集
Lua实现闭包 --[[@Func :实现闭包 @Desc : 当一个函数内部嵌套另一个函数定义时,内部的函数体可以访问外部的函数的局部变量,这种特征我们称作词法定界]] function fuck() local i = 0 return function() i = i + 1 return i end end c1 = fuck() print(c1()) print(c1()) 序列化Lua表 -- Desc : 序列化Lua表(Co
晚晴幽草轩轩主
2018/03/27
9480
1049 数列的片段和 (20 分)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
韩旭051
2019/11/08
4730
golang代码片段(摘抄)
用户1141560
2017/12/22
7490
golang代码片段(摘抄)
如何快速创建 Visual Studio 代码片段?
使用 Visual Studio 的代码片段功能,我们可以快速根据已有模板创建出大量常用的代码出来。ReSharper 已经自带了一份非常好用的代码片段工具,不过使用 ReSharper 创建出来的代码片段只能用在 ReSharper 插件中。如果团队当中有一些小伙伴没有 ReSharper(毕竟很贵),那么也可以使用到 Visual Studio 原生的代码片段。
walterlv
2023/10/22
4700
如何快速创建 Visual Studio 代码片段?

相似问题

socialengine与外部php网站集成

21

与外部系统集成

30

Facebook与外部网站的集成

20

JIRA与外部系统的集成

12

OpenERP (Odoo)与外部系统的集成

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文