10.ORM操作

ORM操作

  • 基本查询
# 单一查询 如果结果不存在报错
queryset = User.objects.filter(username="张三") 
# 查询全部
queryset = User.objects.all() 
# 查询数量的结果(结果是数字)  不需要序列化 直接return
queryset = User.objects.filter(username="张三").count()   
# 查询结果取反
queryset = User.objects.exclude(username="张三") 
  • 模糊查询

    • contains 是否包含

      # 查询结果包含‘张’
      queryset = User.objects.filter(username__contains="张")    
      
    • startswith,endswith 以指定值开头或结尾

      # 查询以‘李’字开头的数据
      queryset = User.objects.filter(username__startswith="李")   
      # 查询以四结尾的数据
      queryset = User.objects.filter(username__endswith="四")          
      
    • isnull 是否为空
# 查询home不为空
queryset = User.objects.filter(home__isnull=False)          
  • 范围查询
    • in 在范围内
    • renge 相当于between...and...
# 查询id为1或2或5的数据
queryset = User.objects.filter(id__in=[1,2,5])   
# 查询范围为1-5的 id
queryset = User.objects.filter(id__range=[1,5])                 
  • 比较查询
    • gt 大于
    • gte 大于等于
    • lt 小于
    • lte 小于等于
    • exclude 不等于
# 查询id大于2的(gt是大于)
queryset = User.objects.filter(id__gt=2) 
# 查询id不等于2的(exclude是不等于)
queryset = User.objects.exclude(id=2)        
  • F对象和Q对象

    • ⽐较两个字段对象之间的关系⽤F对象。(F对象可以进⾏运算)

      # 查询id大于等于2的(gte是大于等于)
      queryset = User.objects.filter(id__gte=2)
      # 查询年龄大于等于身高的对象
      queryset = User.objects.filter(age__gte=F('hight'))     
      
    • 与逻辑运算符连⽤使⽤Q对象。 或( | ) 与( & )  ⾮( ~ )

      # 查询年龄大于等于20或者id小于5的对象
      queryset = User.objects.filter(Q(age__gte=20)|Q(id__lt=5))    
      
  • 聚合函数

    ​ 使⽤aggregate()过滤器调⽤聚合函数。聚合函数包括:Avg 平均,Count 数量,Max 最⼤, Min 最⼩,Sum 求和

    # 求年龄的和(结果是数字 直接return)
    queryset = User.objects.aggregate(Sum('age'))                   
    
  • 排序

    ​  使⽤order_by对结果进⾏排序

    # 按年龄的升序排序
    queryset = User.objects.all().order_by('age') 
    # 按年龄的降序排序
    queryset = User.objects.all().order_by('-age')                   
    
  • 多对多操作

    • 增加

      class ManyToManyTest(APIView):
          def post(self,request):
              # 正向添加
              # user_name = request.data.get('username')
              # role_name = request.data.get('role_name')
              # userobj = models.User.objects.filter(username=user_name).first()
              # roleobj = models.Role.objects.filter(role_name=role_name).first()
              # userobj.roles.add(roleobj)
              # return Response({'code':200,'msg':'成功'})
              # 反向添加
              user_name = request.data.get('user_name')
              role_name = request.data.get('role_name')
              userobj = models.User.objects.filter(username=user_name).first()
              roleobj = models.Role.objects.filter(role_name=role_name).first()
              roleobj.user_set.add(userobj)
              return Response({'code': 200, 'msg': '成功'})
      
    • 删除

      class ManyToManyTest(APIView):
          def delete(self,request):
              # 在建立manytomany的models里删除数据
              # userobj = models.User.objects.filter(id=1).first()
              # roleobj = models.Role.objects.filter(id=1).first()
              # obj = userobj.roles.remove(roleobj)
              # print(obj)
              # return Response('200')
              # 在建立manytomany的models里删除数据
              userobj = models.User.objects.filter(id=2).first()
              roleobj = models.Role.objects.filter(id=1).first()
              obj = roleobj.user_set.remove(userobj)
              print(obj)
              return Response('200')
      
      
    • 修改

      class ManyToManyTest(APIView):
          def put(self,request):
              # 在未建立manytomany的models里修改数据,参数只能是可迭代对象
              # userobj = models.User.objects.filter(id=3)
              # roleobj = models.Role.objects.filter(id=2).first()
              # obj = roleobj.user_set.set(userobj)
              # print(obj)
              # return Response("200")
              # 在未建立manytomany的models里修改数据,参数只能是可迭代对象
              userobj = models.User.objects.filter(id=1).first()
              roleobj =  models.Role.objects.filter(id=1)
              obj = userobj.roles.set(roleobj)
              print(obj)
              return Response('200')
      
      
    • 查看

      class ManyToManyTest(APIView):
              def get(self,request):
              # 正向查询
              # userobj = models.User.objects.get(id=2)
              # roleobj = userobj.roles.all()
              # obj = RoleSer(roleobj,many=True)
              # return Response(obj.data)
              # 反向查询
              role_obj = models.Role.objects.get(id=2)
              userobj = role_obj.user_set.all()
              obj = UserSer(userobj,many=True)
              return Response(obj.data)
      
posted @ 2020-11-25 16:39  瑶瑶y  阅读(40)  评论(0编辑  收藏  举报