Django之Model操作之单表及跨表(双下划线)的3种不同方式获取数据(queryset对象列表、字典、元祖)【ORM篇七】
2019-01-23 05:57
549 查看
版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/Burgess_zheng/article/details/86603899
上一篇:Django之Model操作之多对多(ManyToMany)正反调用【ORM篇六】 点击跳转
目录篇:Django之model操作ORM目录篇 点击跳转
下一篇:Django之Model操作之select_related和prefetch_related【ORM篇八】点击跳转
目录
具体示例
实战Django之Model操作之单表及跨表(双下划线)的3种不同方式获取数据(queryset对象列表、字典、元祖)https://blog.csdn.net/Burgess_zheng/article/details/86603903
创建表类
路径:project/app/models.py
[code]from django.db import models class Business(models.Model): #默认:自动创建id自增列(主键) caption = models.CharField(max_length=32) code = models.CharField(max_length=32,null=True,default="SA") #django可以修改表结构: #后期新增加一个字段 #那么该字段需要使用参数null=True(允许空) or default= '默认值' #如果该字段没有使用上面两个参数, 那么执行生成表的时候会提示让你输入默认值 #主机表 class Host(models.Model): nid = models.AutoField(primary_key=True) #自定义自增列(主键),如不写自动创建 hostname = models.CharField(max_length=32,db_index=True) #db_index=True 普通索引(因为主机名经常被查询) ip = models.GenericIPAddressField(protocol="both",db_index=True ) #IPAddressField 只支持IPV4(现在使用报错,被移除掉了) #GenericIPAddressField(protocol="both" ) 支持IPV4,和IPV6 # 默认:GenericIPAddressField(protocol="ipv4" ) 支持IPV4 port = models.IntegerField() #数字类型不用加字符长度,否则报错 b = models.ForeignKey(to="Business",to_field='id',on_delete=models.CASCADE) #外键关联Business表(属于该表的哪个业务线),关联Business表主键id
表数据
Business表
Host表
具体操作
路径:project/app/views.py
单表
[code]from django.shortcuts import render,HttpResponse,redirect from app import models def business(request): print('-----对象形式获取方式-------') v1 = models.Business.objects.all() print(v1) #v1=QuerySet对象类型: #[obj(id.caption.code),obj(id.caption.code),obj(id.caption.code)] #对象取值方式:通过点如:v1.id v1_1 = models.Business.objects.filter(id=1) # 获取的是匹配的对象 v1_2 = models.Business.objects.filter(id=1).first() # 获取是对象,但是如果不存在的话返回是None print('-----values字典形式获取方式-------') v2 = models.Business.objects.all().values('id','caption') print(v2) #values(..) :类似数据库原生sql语句: # select * from tb 获取该表所有字段数据 # select id,caption from tb 获取id字段、caption字段数据 #v=QuerySet字典类型: #[{'id':1,'caption':'运维部'},{'id':2,'caption':'...'}] #字典取值方式:Python通过["key"],但是模板渲染通过点,如:v2.id print('-----values_list元组形式获取方式-------') v3 = models.Business.objects.all().values_list('id','caption') print(v3) #values(..) :类似数据库原生sql语句: # select * from tb 获取该表所有字段数据 # select id,caption from tb 获取id字段、caption字段数据 #v=QuerySet元组类型: #[(1,运维),(2,开发)] # 元组取值方式:Python通过[下标],但是模板渲染通过.取值,如:v3.0 return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})跨表(双下划线)
[code]from django.shortcuts import render,HttpResponse,redirect from app import models def host(request): print('----外键跨表获取数据第1种方式:obj通过点.字段名方式-----') v1 = models.Host.objects.all() for row in v1: print(row.nid,row.hostname,row.ip,row.port,row.b_id, row.b, row.b.id,row.b.caption,row.b.code,sep='\t') #row.b 的b字段其实就是封装了外键对应Business表的主键的数据对象 #既然是对象,就可以通过点.进行调取该对象的元素 #sep='\t'没个逗号直接增加个tab空格 #打印的结果: #1 c1.com 1.1.1.1 9900 1 Business object 1 运维部 SA #2 c2.com 1.1.1.2 80 1 Business object 1 运维部 SA #3 c3 1.1.1.3 90 2 Business object 1 开发部 SA print(v1[0].b.caption) #也通过下标获取对应的数据 #v1的整个表[(每一行数据),(每一行数据)....] print('----外键跨表获取数据第2种方式:values字典通过双下划线__字段名方式-----') # 外键跨表获取关联数据第二种方式:values # (QuerySet字典类型,通过双下划线__字段名就可跨表获取数据) v2 = models.Host.objects.filter(nid__gt=0).values('nid', 'hostname', 'b_id', 'b__caption') for row in v2: print(row['nid'],row['hostname'],row['b_id'], row['b__caption'],sep='\t') print('----外键跨表获取数据第3种方式:values_list元组通过点.下标方式-----') # 外键跨表获取关联数据第三种方式:values__list # (QuerySet字典类型,基于values的基础上获取指定数据后,调取方式.下标) v3 = models.Host.objects.filter(nid__gt=0).values_list('nid', 'hostname', 'b_id', 'b__caption', 'b__code') for row in v3: print(row[0],row[1],row[2],row[3],row[4],sep='\t') return render(request,'host.html',{'v1':v1,'v2':v2,'v3':v3})
上一篇:Django之Model操作之多对多(ManyToMany)正反调用【ORM篇六】 点击跳转
目录篇:Django之model操作ORM目录篇 点击跳转
下一篇:Django之Model操作之select_related和prefetch_related【ORM篇八】点击跳转
相关文章推荐
- django学习笔记---获取关联表单数据的3种方式(列表,字典,元祖)。
- python中的列表,元祖,字典,等基本数据类型的操作
- 【原创】操作chosen-获取值到对象-遍历对象以数组的方式追显-删除对象数据
- python 数据结构(字典,列表,元祖)简单操作
- django模板中获取列表或字典中的数据
- 数据持久化3种方式:属性列表、对象归档、数据库存储
- Django之Model的表类和字段对象的一些常用操作【ORM篇十】
- EF在单例模式及C/S方式开发时,操作数据对象以后如果发生异常,要做善后工作。
- jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
- Scalaz(26)- Lens: 函数式不可变对象数据操作方式
- SpringMVC06以对象的方式获取前台的数据
- Sharepoint2010应用开发四:使用客户对象模型(Client Object Model)向SharePoint列表写数据
- 在Python的Django框架中获取单个对象数据的简单方法
- python实操(5):python数据类型及常用操作,数字、字符串、元组、列表、字典、集合
- Django 如何将model对象转json数据
- MVVM模式的View与ViewModel的三大通讯方式:Binding Data(实现数据的传递)、Command(实现操作的调用)和Attached Behavior【转】
- jQuery获取不同input数据的方式
- 新闻模块之新闻列表-使用datalist 模块获取数据-页面表示层(Linq方式)-2
- Django Model获取指定列的数据