kution 发表于 2018-8-9 07:36:24

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]
查看完整版本: Python基础(Django三——Model)