Django 多表联合查询

简介:

一对多的表查询


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class  Project(models.Model):
     name  =  models.CharField(u '项目名称' ,max_length = 32 ,blank = True )
     id  =  models.CharField(u '项目ID' ,max_length = 32 ,unique = True ,primary_key = True ,blank = True )
     create_date  =  models.DateTimeField(u '创建时间' , auto_now_add = True )
     update_date  =  models.DateTimeField(u '更新时间' , auto_now = True )
     def  __unicode__( self ):
         return  self .name
         
class  Uhost(models.Model):
     name  =  models.CharField(u '计算机名' ,max_length = 32 ,blank = False )
     id  =  models.CharField(u '实例ID' ,max_length = 32 ,blank = False ,primary_key = True )
     ip  =  models.GenericIPAddressField(u 'IP地址' ,blank = True ,null = True )
     cpu  =  models.CharField(u 'CPU/核' ,max_length = 32 ,blank = True ,null = True )
     memory  =  models.CharField(U '内存/G' ,max_length = 32 ,blank = True )
     state  =  models.CharField(u '实例状态' ,max_length = 32 ,blank = True )
     expiretime  =  models.DateTimeField(u '到期时间' , max_length = 50 , null = True , blank = True )
     isexpire  =  models.CharField(u '是否过期' , max_length = 20 , blank = True )
     autorenew  =  models.CharField(u '自动续费' , max_length = 20 , blank = True )
     tag  =  models.CharField(u '业务组' ,max_length = 32 ,blank = True )
     networkstate  =  models.CharField(u '网络状态' ,max_length = 32 ,blank = True )
     type  =  models.CharField(u '实例类型' ,max_length = 32 ,blank = True )
     osfamily  =  models.CharField(u '系统类型' ,max_length = 32 ,blank = True )
     ostype  =  models.CharField(u '操作系统' , max_length = 50 , blank = True )
     chargetype  =  models.CharField(u '付费类型' , max_length = 50 , blank = True )
     datadisk  =  models.IntegerField(u '数据盘/G' , blank = True )
     price  =  models.DecimalField(u '价格' ,max_digits = 8 ,decimal_places = 2 ,null = True ,blank = True )
     zone  =  models.ForeignKey(Zone,verbose_name = u '可用区' ,db_constraint = False ,on_delete = models.DO_NOTHING,blank = True )
     project  =  models.ForeignKey(Project,verbose_name = u '所属项目' ,db_constraint = False ,on_delete = models.DO_NOTHING,blank = True )
     create_date  =  models.DateTimeField(u '创建时间' , auto_now_add = True )
     update_date  =  models.DateTimeField(u '更新时间' , auto_now = True )
     def  __unicode__( self ):
         return  self .name

我建了两张表,project和uhost。

其中uhost表的project字段是设置了ForeignKey。

先看下project表中的内容。

1
2
3
4
5
6
7
8
9
10
11
>>> Project.objects. all ()
[<Project: 上海别样红信息技术有限公司>, <Project: 备案专用>, <Project: gitlab>, 
<Project: PublicTest>, <Project: SPMS>, <Project: 安全测试>, <Project: OTA>, 
<Project:  99 数据同步中转,本项目与 99 内网打通,不允许添加任何机器>, <Project: Ops>,
  <Project: iPms>]
 
>>> Project.objects. all ().values( 'id' )
[{ 'id' : u 'org-81' }, { 'id' : u 'org-aws3dj' }, { 'id' : u 'org-et55qg' }, 
{ 'id' : u 'org-ghan2t' }, { 'id' : u 'org-ja1wvv' }, { 'id' : u 'org-kbxrx4' }, 
{ 'id' : u 'org-pni2a2' }, { 'id' : u 'org-qf4d2n' }, { 'id' : u 'org-vzfixt' }, 
{ 'id' : u 'org-wrg10n' }]


表查询:

查询uhost表中name中包含OPS10的所有主机对象

1
2
3
4
5
6
7
8
>>> Uhost.objects. filter (name__contains = 'OPS10' )
[<Uhost: SRV - OPS10 - CS05>, <Uhost: SRV - OPS10 - SPPX01>, <Uhost: SRV - OPS10 - MAIL01>, 
<Uhost: SRV - OPS10 - PROXY02>, <Uhost: SRV - OPS10 - PROXY01>, <Uhost: SRV - OPS10 - HAP02>,
  <Uhost: SRV - OPS10 - HAP01>, <Uhost: SRV - OPS10 - ANSIBLE02>, <Uhost: SRV - OPS10 - NGX01>, 
  <Uhost: SRV - OPS10 - NGX02>, <Uhost: SRV - OPS10 - PROXY05>, <Uhost: SRV - OPS10 - ANSIBLE06>, 
  <Uhost: SRV - OPS10 - DEPLOY01>, <Uhost: SRV - OPS10 - NGINX01>, <Uhost: SRV - OPS10 - ES02>, 
  <Uhost: SRV - OPS10 - ES03>, <Uhost: SRV - OPS10 - ES01>, <Uhost: SRV - OPS10 - LOGSTASH01>, 
  <Uhost: SRV - OPS10 - PROXY04>, <Uhost: SRV - OPS10 - PROXY03>,  '...(remaining elements truncated)...' ]


正向查询:

若关系模型A包含与模型B关联的关联字段, 模型A的实例可以通过关联字段访问与其关联的模型B的实例:

Django提供了一种使用双下划线__的查询语法:

例如:

1
Uhost.objects. filter (project__id = 'org-81' )


查找uhost表中,所有project id为org-81’的的主机

1
2
3
4
5
6
7
>>> Uhost.objects. filter (project__id = 'org-81' )
[<Uhost: dbbackupsyncer2>, <Uhost: SRV - CPMS10 - WEB16>, <Uhost: SRV - CPMS10 - WEB15>, 
<Uhost: publicconsole>, <Uhost: SRV - CPMS10 - WEB14>, <Uhost: dbbackupsyncer>,
<Uhost: 官网>, <Uhost:  99exchangedb >, <Uhost: dc1>, <Uhost: dc2>, <Uhost: publicweb>, 
<Uhost: SRV - CPMS10 - WEB13>, <Uhost: SRV - OTA10 - WS04>, <Uhost: SRV - OTA10 - WS05>, 
<Uhost: SRV - OPS10 - CS05>, <Uhost: SRV - OTA10 - WS03>, <Uhost: SRV - OTA10 - WEB04>, 
<Uhost: SRV - OTA10 - WEB03>, <Uhost:  99datasyncer >, <Uhost: SRV - CPMS10 - WEB31>,  '...(remaining elements truncated)...' ]

查询uhost表中project id包含‘ghan’的主机信息

1
2
3
4
5
>>> Uhost.objects. filter (project__id__contains = 'ghan' )
[<Uhost: SRV - OPS10 - ANSIBLE06>, <Uhost: SRV - OPS10 - DEPLOY01>, \
<Uhost: SRV - OPS01 - DEPLOY01>, <Uhost: SRV - OPS10 - NGINX01>, \
<Uhost: SRV - OPS10 - ES02>, <Uhost: SRV - OPS10 - ES03>, <Uhost: SRV - OPS10 - ES01>,\
<Uhost: SRV - OPS10 - LOGSTASH01>]




反向查询:

被索引的关系模型可以访问所有参照它的模型的实例,如Entry.blog作为Blog的外键,默认情况下Blog.entry_set是包含所有参照Blog的Entry示例的查询集,可以使用查询集API取出相应的实例。

查询project name为Ops的所有主机对象

1
2
3
4
5
>>> Project.objects.get(name = 'Ops' ).uhost_set. all ()
[<Uhost: SRV - OPS10 - ANSIBLE06>, <Uhost: SRV - OPS10 - DEPLOY01>,
<Uhost: SRV - OPS01 - DEPLOY01>, <Uhost: SRV - OPS10 - NGINX01>, 
<Uhost: SRV - OPS10 - ES02>, <Uhost: SRV - OPS10 - ES03>, <Uhost: SRV - OPS10 - ES01>, 
<Uhost: SRV - OPS10 - LOGSTASH01>]


查询project name为Ops的所有主机对象的name属性

1
2
3
4
5
>>> Project.objects.get(name = 'Ops' ).uhost_set.values( 'name' )
[{ 'name' : u 'SRV-OPS10-ANSIBLE06' }, { 'name' : u 'SRV-OPS10-DEPLOY01' }, \
{ 'name' : u 'SRV-OPS01-DEPLOY01' }, { 'name' : u 'SRV-OPS10-NGINX01' }, \
{ 'name' : u 'SRV-OPS10-ES02' }, { 'name' : u 'SRV-OPS10-ES03' }, \
{ 'name' : u 'SRV-OPS10-ES01' }, { 'name' : u 'SRV-OPS10-LOGSTASH01' }]


查询project name为Ops的,并且name包含OPS字符串的所有主机

1
2
3
4
5
>>> Project.objects.get(name = 'Ops' ).uhost_set. filter (name__contains = 'OPS' )
[<Uhost: SRV - OPS10 - ANSIBLE06>, <Uhost: SRV - OPS10 - DEPLOY01>, 
<Uhost: SRV - OPS01 - DEPLOY01>, <Uhost: SRV - OPS10 - NGINX01>, 
<Uhost: SRV - OPS10 - ES02>, <Uhost: SRV - OPS10 - ES03>, <Uhost: SRV - OPS10 - ES01>, 
<Uhost: SRV - OPS10 - LOGSTASH01>]


一对多表创建对象:

1
2
3
4
>>> host = Uhost( id = 'aaaaa' )
>>> host.project = Project.objects.get( id = 'org-81' )
>>> host = Uhost(name = 'SRV-TEST' )
>>> host.save()



多对多的查询

示例:

1
2
3
4
5
6
7
8
9
10
11
12
class  GroupInfo(models.Model):
     name  =  models.CharField(U '组名' ,max_length = 32 ,blank = True )
     def  __unicode__( self ):
         return  self .name
         
         
class  UserInfo(models.Model):
     name  =  models.CharField(u '姓名' ,max_length = 32 ,blank = True )
     email  =  models.EmailField(u '邮箱' )
     group  =  models.ManyToManyField(GroupInfo)
     def  __unicode__( self ):
         return  self .name


wKioL1jHl0Wh-ai7AABc2BMow3M250.png

wKiom1jHl0bCyrzrAABtjlsZJro099.png


查询:

从userinfo表开始查

1
2
3
4
>>> UserInfo.objects.get(name = 'zeng' ).group. all ()
[<GroupInfo: 运维组>, <GroupInfo: 报警组>]
>>> UserInfo.objects.get(name = 'zeng' ).group. filter (name = '运维组' )
[<GroupInfo: 运维组>]


从groupinfo表开始查

1
2
3
4
>>> GroupInfo.objects.get(name = 'CTO' ).userinfo_set. all ()
[<UserInfo: zhang>]
>>> GroupInfo.objects.get(name = 'CTO' ).userinfo_set.values( 'name' , 'email' )
[{ 'name' : u 'zhang' 'email' : u 'zhang@qq.com' }]


多对多表 创建对象


1
2
3
>>> u  =  UserInfo(name = 'he' ,email = 'he@qq.com' )
>>> u.save()
>>> u.group.add(GroupInfo.objects.get(name = '运维组' ))

注意:

要添加新对象时,首先必须保证该对象在做ManyToMany的两张表中存在才行,比如上面的例子,我想创建一个叫he的用户,组为运维组。但是he这个用户不存在,所以先必须创建he这个对象,才能给他添加到运维组。

wKiom1jHoKawe8KfAAChgqWrYyk912.png










本文转自 曾哥最爱 51CTO博客,原文链接:http://blog.51cto.com/zengestudy/1906221,如需转载请自行联系原作者

目录
相关文章
|
7月前
|
搜索推荐 前端开发 数据可视化
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
268 1
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
|
7月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
361 4
|
4月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
340 45
|
6月前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
207 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
4月前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
144 2
|
4月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
85 1
|
5月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
88 4
|
6月前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
276 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
6月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
201 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
6月前
|
前端开发 搜索推荐 算法
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
中草药管理与推荐系统。本系统使用Python作为主要开发语言,前端使用HTML,CSS,BootStrap等技术和框架搭建前端界面,后端使用Django框架处理应用请求,使用Ajax等技术实现前后端的数据通信。实现了一个综合性的中草药管理与推荐平台。具体功能如下: - 系统分为普通用户和管理员两个角色 - 普通用户可以登录,注册、查看物品信息、收藏物品、发布评论、编辑个人信息、柱状图饼状图可视化物品信息、并依据用户注册时选择的标签进行推荐 和 根据用户对物品的评分 使用协同过滤推荐算法进行推荐 - 管理员可以在后台对用户和物品信息进行管理编辑
177 12
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发