Python基础(Django三——Model)
# -*- coding:utf-8 -*-from django.shortcuts import render,HttpResponse
from app01 import models
# Create your views here.
def user_info(request):
# 一对多 #
# models 为"OneToMany example 1"
#创建数据#
#第一种: ForeignKey所在的字段加 _id 进行直接赋值
models.UserInfo.objects.create(username='test1',age=13,user_type_id=1) #user_type_id是一对多关系表中Django自动生成的字段名
#第二种:ForeignKey所在的字段使用对象进行赋值
user_type_obj = models.UserType.objects.get(id=2) #先从user_type表中获取一个对象
models.UserInfo.objects.create(username='test2',age=14,user_type=user_type_obj) #使用刚获取的对象进行赋值(注意字段名称)
#正向查找#(就是从ForeignKey所在字段的表去查询数据)
#单表查询
models.UserInfo.objects.filter(username='test1') #查询UserInfo表中username字段值是‘test1’的数据
# 跨表查询,通过ForeignKey所在的字段 + 双下划线 + 被跨的表中的字段来查询(ForeignKey所在的字段user_type是一个对象)
# models.UserInfo.objects.filter(user_type__caption='CEO') #查询UserInfo表中user_type对象中caption字段的值是CEO的数据
ret = models.UserInfo.objects.filter(user_type__id=2) #语法同上,ret是一个QuerySet对象
for i in ret:
#打印获取到的QuerySet对象中每个值的username属性,以及user_type对象的caption属性(跨表操作时,查询使用__(双下划线),访问字段使用.(点))
print i.username,i.user_type.caption
#反向查找#(就是从被ForeignKey字段关联的表去查询数据)
#单表查询
line = models.UserType.objects.get(id=1) #从UserType表中获取一个id=1的对象
#跨表查询
# 第一种: 通过被跨的表的小写表名 + 双下划线 + 要查询的字段来查询
models.UserType.objects.get(userinfo__username='test1') #userinfo是django自动在UserType表中创建的一个对象,也就是对端表的小写表名
# 第二种:
line.userinfo_set.filter(username='test1')
# line是一个对象(参考如上的获取条件)
# userinfo_set是UserInfo表中满足line条件的所有值。也就是UserInfo表中所有user_type=1 的值
# 本次查询的目标是:通过UserType表去反向查询UserInfo表中user_type=1且username=test1的所有数据
line.userinfo_set.all().count() #计算满足查询条件的数据个数
#多级查询, models 为"OneToMany example 2"
ret = models.News.objects.filter(favor__user_obj__username='zhangsan')
# 查询的表顺序为 News -> Favor -> MyUser
# 先是反向跨表查询:通过News表查询Favor表中的user_obj对象
# 再是正向跨表查询:通过user_obj对象查询Myuser表中username字段值为zhangsan的用户
# 最终得到zhangsan赞过的所有文章
for i in ret:
print i.title #文章的标题
print i.favor_set.all().count() #文章一共几个赞
# 多对多 #
#models为 "ManyToMany example 1"
models.HostAdmin.objects.create(username='a1',email='1@qq.com') #创建一个用户,管理的主机为空
#正向添加#
admin_obj = models.HostAdmin.objects.get(username='a1') #先获取一个用户对象
host_list = models.Host.objects.filter(id__lt=3) #再获取多个主机对象
admin_obj.host.add(*host_list) #为一个用户添加多个可管理的主机
#反向添加#
host_obj = models.Host.objects.get(hostname='h1') #先获取一个主机对象
admin_list = models.HostAdmin.objects.filter(id__gt=1)#再获取多个用户对象
host_obj.hostadmin_set.add(*admin_list) #为一个主机添加多个用户,注意这里用到了hostadmin_set
#正向查询#
admin_obj = models.HostAdmin.objects.get(username='a1') #先获取一个用户对象
host_list = admin_obj.host.all() #查询该用户管理的所有主机
for i in host_list:
print i.hostname,i.port
#反向查询#
host_obj = models.Host.objects.get(hostname='h1') #先获取一个主机对象
admin_list = host_obj.hostadmin_set.all() #查询该主机的所有管理员
for i in admin_list:
print i.username,i.email
#自定义多对多关系#
# models为 "ManyToMany example 2"
# 添加数据
models.HostRelation.objects.create(
host_obj_id = 1, #等于 host_obj = models.Host2.objects.get(id=1)
admin_obj_id = 1, #等于 admin_obj = models.HostAdmin2.objects.get(id=1)
)
# 查询
# relation_list = models.HostRelation.objects.all()
relation_list = models.HostRelation.objects.filter(admin_obj__username='user1')
#通过HostRelation表查询用户名是user1的所有数据
for i in relation_list:
print i.admin_obj.username #用户名
print i.host_obj.hostname#用户所管理主机的主机名
# Django 的F #
# 对对象中某一列值的操作
from django.db.models import F
models.Host.objects.filter(hostname='h1').update(port=F('port')+1) #把Host表中所有hostname=h1的数据的port值加1
models.Host.objects.update(port=F('port')+1) #把Host表中所有的port值加1
# Django 的Q #
# 对象的复杂查询
from django.db.models import Q
#单Q多条件查询
q1 = Q() #创建一个Q对象
q1.connector = 'OR' #定义查询条件是 '或'
q1.children.append(('hostname__contains','h1')) #children添加的是元祖,查询字段支持使用一些自带的方法
q1.children.append(('hostname','h2')) #添加多个查询条件
q1.children.append(('hostname','h5'))
ret_list = models.Host.objects.filter(q1) #使用q1对象进行查询(针对Host表)
for i in ret_list:
print '%s->%s'%(i.hostname,i.port)
#多Q多条件查询
con = Q() #创建一个外层Q对象,Q可以嵌套
q2 = Q()
q2.connector = 'OR'
q2.children.append(('port','23')) #查询port字段值等于23的数据
q2.children.append(('port__gt','23')) #查询port字段值大于23的数据
con.add(q1,'AND') #把q1添加到之前定义的最外层的Q对象中,查询条件是 '和'
con.add(q2,'AND') #把q2添加到之前定义的最外层的Q对象中,查询条件是 '和'
ret_list = models.HostAdmin.objects.filter(con) #查询的结果是同时满足q1和q2条件的数据(针对HostAdmin表)
for i in ret_list:
print '%s->%s'%(i.hostname,i.port)
#多Q多条件跨表查询
q1.children.append(('username','a1'))
q1.children.append(('username','a2'))
q1.children.append(('username','a3'))
q2.children.append(('host__hostname','h4')) #支持跨表查询,host是表名 + 双下划线 + 查询的字段
con.add(q1,'AND')
con.add(q2,'AND')
ret_list = models.HostAdmin.objects.filter(con) #查询用户名是a1或a2或a3 且管理主机名为h4的用户(针对HostAdmin表)
for i in ret_list:
print i.username
return HttpResponse('ok') #无特别意义,只是函数需要一个返回值。
页:
[1]