Django之Model操作之单表及跨表(双下划线)的3种不同方式获取数据(queryset对象列表、字典、元祖)【ORM篇七】

上一篇: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

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表

Django之Model操作之单表及跨表(双下划线)的3种不同方式获取数据(queryset对象列表、字典、元祖)【ORM篇七】_第1张图片

Host表

 

Django之Model操作之单表及跨表(双下划线)的3种不同方式获取数据(queryset对象列表、字典、元祖)【ORM篇七】_第2张图片

 

    具体操作      

路径:project/app/views.py  

单表

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})

跨表(双下划线)

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)