Django 跨表查询--神奇的双下划线和点

简介:

我在django的moles中创建了两个calss,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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)
     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


首先我们要理解两个概念==> Object对象和QuerySet查询集


Object对象

一个object对象就是表中的一条数据,表中所有的字段它都有。例如我取Uhost表中的第一个对象

1
2
3
>>> host  =  Uhost.objects. all ()[ 0 ]
>>>  print  type (host)
< class  'ucloud.models.Uhost' >

对象获取某个值使用“.”

例如:

1
2
3
4
5
6
>>> host. id
u 'uhost-3th2rp'
>>> host.ip
u '10.6.13.253'
>>> host.project
<Project: CPMS10>

注意:Uhost表中project字段是一个ForeighKey,当获取host.project时,获取到的结果是一个对象

我们还可以获取这个对象其他值,比如Project表中定义了name、id、create_time、update_time四个字段,我们可以通过下面的方式获取

1
2
3
4
5
6
7
8
>>> host.project.name
u 'CPMS10'
>>> host.project. id
u 'org-81'
>>> host.project.create_date
datetime.datetime(2017, 3, 6, 12, 21, 7, 296546)
>>> host.project.update_date
datetime.datetime(2017, 5, 19, 16, 19, 8, 925978)

总结:对象获取某一列值(或者说是获取某个属性)的时候,使用点来获取。我们跨表查询时,也是使用点来获取。


上面的例子中,我们获取host的project值还可以使用下面这种方式获取:

1
2
3
4
5
6
>>> host.project_id
u 'org-81'
>>> host.project_name
Traceback (most recent call last):
   File  "<console>" , line 1,  in  <module>
AttributeError:  'Uhost'  object has no attribute  'project_name'

这里我们之所以能获取到project_id这个字段的值是因为,在Uhost表中project字段是ForeignKey,而在数据库中被设置了外键的列,在数据库中的字段名就是本表中的列名 +“_“”+被设置外键的表的那个字段名,而Project表中id是primary_key,所以id列被设置了外键 。

由上可知,host.project.id是跨表查询,而host.project_id并不是跨表查询。因为这个字段在自己表中。



QuerySet查询集:

查询集是一组数据的集合,跟python的list基本一样的。例如获取以下方法可以获取Uhost表中所有对象的ip和name。

1
2
3
4
>>> host2 = Uhost.objects.all().values( 'ip' , 'name' )
>>> print  type (host2)
<class  'django.db.models.query.ValuesQuerySet' >
[{ 'ip' : u '10.6.13.253' 'name' : u 'dbbackupsyncer2' }, { 'ip' : u '10.6.30.43' 'name' : u 'SRV-CPMS10-WEB16' }, { 'ip' : u '10.6.20.189' 'name' : u 'SRV-CPMS10-WEB15' }, { 'ip' : u '10.6.14.232' 'name' : u 'publicconsole' }, { 'ip' : u '10.6.10.236' 'name' : u 'SRV-CPMS10-WEB14' }, { 'ip' : u '10.6.10.159' 'name' : u 'dbbackupsyncer' }, { 'ip' : u '10.6.11.73' 'name' : u '\u5b98\u7f51' }, { 'ip' : u '10.6.7.170' 'name' : u '99exchangedb' }, { 'ip' : u '10.6.5.22' 'name' : u 'dc1' }, { 'ip' : u '10.6.3.243' 'name' : u 'dc2' }, { 'ip' : u '10.6.2.213' 'name' : u 'publicweb' }, { 'ip' : u '10.6.8.163' 'name' : u 'SRV-CPMS10-WEB13' }, { 'ip' : u '10.10.16.165' 'name' : u 'SRV-OTA10-WS04' }, { 'ip' : u '10.10.31.79' 'name' : u 'SRV-OTA10-WS05' }, { 'ip' : u '10.10.187.86' 'name' : u 'SRV-OTA10-WS03' }, { 'ip' : u '10.10.102.32' 'name' : u 'SRV-OTA10-WEB04' }, { 'ip' : u '10.10.107.144' 'name' : u 'SRV-OTA10-WEB03' }, { 'ip' : u '10.10.112.46' 'name' : u '99datasyncer' }, { 'ip' : u '10.10.48.121' 'name' : u 'SRV-CPMS10-WEB31' }, { 'ip' : u '10.10.218.108' 'name' : u 'SRV-CPMS10-WEB30' },  '...(remaining elements truncated)...' ]


QuerySet如果跨表查询呢?

我们知道对象跨表查询可以用点,QuerySet可以使用双下划线“__”,例如获取Uhost表中所有对象的project id 和project name,可以这样做:

1
2
3
>>> host2 = Uhost.objects.all().values( 'ip' , 'name' , 'project__id' , 'project__name' )
>>> host2[0]
{ 'ip' : u '10.6.13.253' 'project__name' : u 'CPMS10' 'name' : u 'dbbackupsyncer2' 'project__id' : u 'org-81' }

总结:查询集做跨表查询时,使用双下划线"__"










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

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