您的位置:首页 > 产品设计 > UI/UE

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篇八】点击跳转​​​​​​​

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐