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

目录篇:Django之model操作ORM目录篇 点击跳转
主篇:Django之Model操作之单表及跨表(双下划线)的3种不同方式获取数据【ORM篇七】点击跳转

目录

  •  建立表类
  • 表数据(django自带的sqlite可视化进行添加,当然也可以进行命令添加)
  • 根据类表进行django的shell命令行操作
  •     单表
  •     跨表

 建立表类

跳转:实战之Django之Model建表流程 https://blog.csdn.net/Burgess_zheng/article/details/86564984

路径:project/modes_handle/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

进入项目目录下执行以下面命令(创建表 or 重新生成表结构)
python manage.py makemigrations
python manage.py migrate

表数据(django自带的sqlite可视化进行添加,当然也可以进行命令添加)

Business表

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

Host表

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

根据类表进行django的shell命令行操作

进入项目目录(执行如下命令进行django提供的shell命令行)
F:\Burgess\Python\pycharm实验脚本\test\project_burgess>python manage.py shell

    单表

对象形式获取方式:其实就类似[{字段名:字段值,字段名:字段值,...},{}]

>>> from modes_handle import models
>>> queryset = models.Business.objects.all()
>>> queryset1 = models.Business.objects.filter(id=1)
>>> queryset2 = models.Business.objects.filter(id=2).first()
>>> queryset
, , , ]>
>>> queryset1
]>
>>> queryset2

values字典形式获取方式:其实就类似[{字段名:字段值,字段名:字段值,...},{}]但是只取values里面设置的字段名和字段值

>>> from modes_handle import models
>>> dict = models.Business.objects.all().values('id','caption')
>>> dict

values_list元组形式获取方式:其实就类似[(字段值,字段值...),(字段值,字段值...)]

>>> from modes_handle import models
>>> tuple = models.Business.objects.all().values_list('id','caption')
>>> tuple

    跨表

对象形式获取方式:其实就类似[{字段名:字段值,字段名:字段值,...},{}]

>>> from modes_handle import models
>>> from modes_handle import models
>>> queryset = models.Host.objects.all()
>>> for row in queryset:
...     print('host表:',row.nid,row.hostname,row.ip,row.port,row.b_id,sep='\t')
...     print('关联对象',row.b)
...     print('关联对象内容:',row.b.id,row.b.caption,row.b.code,sep='\t')
...     print('-------------------下一条-----------------')
...
host表:        1       c1.com  1.1.1.1 9900    1
关联对象 Business object (1)
关联对象内容:  1       运维部  SA
-------------------下一条-----------------
host表:        2       c2.com  1.1.1.2 80      1
关联对象 Business object (1)
关联对象内容:  1       运维部  SA
-------------------下一条-----------------
host表:        3       c3      1.1.1.3 90      2
关联对象 Business object (2)
关联对象内容:  2       开发部  SA
-------------------下一条-----------------
>>>

values字典形式获取方式:其实就类似[{字段名:字段值,字段名:字段值,...},{}]但是只取values里面设置的字段名和字段值

>>> from modes_handle import models
>>> dict = models.Host.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption')
>>> dict

values_list元组形式获取方式:其实就类似[(字段值,字段值...),(字段值,字段值...)]

>>> from modes_handle import models
>>> tuple = models.Host.objects.filter(nid__gt=0).values_list('nid','hostname','b_id','b__caption','b__code')
>>> tuple

这里双下划线的两种解释:__gt:增加一个判断条件大于   b__caption:取外键关联的指定字段值

目录篇:Django之model操作ORM目录篇 点击跳转
主篇:Django之Model操作之单表及跨表(双下划线)的3种不同方式获取数据【ORM篇七】点击跳转

你可能感兴趣的:(Django,Django之model实战篇,Django实战篇【总】)