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

版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/Burgess_zheng/article/details/86603903

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

目录


 建立表类

跳转:实战之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表

Host表

根据类表进行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
<QuerySet [<Business: Business object (1)>, <Business: Business object (2)>, <Business: Business object (3)>, <Business: Business objec
t (4)>]>
>>> queryset1
<QuerySet [<Business: Business object (1)>]>
>>> queryset2
<Business: Business object (2)>

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

>>> from modes_handle import models
>>> dict = models.Business.objects.all().values('id','caption')
>>> dict
<QuerySet [{'caption': '运维部', 'id': 1}, {'caption': '开发部', 'id': 2}, {'caption': '市场部', 'id': 3}, {'caption': '测试', 'id': 4}
]>

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

>>> from modes_handle import models
>>> tuple = models.Business.objects.all().values_list('id','caption')
>>> tuple
<QuerySet [(1, '运维部'), (2, '开发部'), (3, '市场部'), (4, '测试')]>

    跨表

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

>>> 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
<QuerySet [{'hostname': 'c1.com', 'b_id': 1, 'b__caption': '运维部', 'nid': 1}, {'hostname': 'c2.com', 'b_id': 1, 'b__caption': '运维部
', 'nid': 2}, {'hostname': 'c3', 'b_id': 2, 'b__caption': '开发部', 'nid': 3}]>

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
<QuerySet [(1, 'c1.com', 1, '运维部', 'SA'), (2, 'c2.com', 1, '运维部', 'SA'), (3, 'c3', 2, '开发部', 'SA')]>

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

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

猜你喜欢

转载自blog.csdn.net/Burgess_zheng/article/details/86603903
今日推荐