ORM其它查询

F查询和Q查询

  当一般的查询已经无法满足我们的需求时,Django为我们提供了F和Q查询的复杂语句。假如,对数据库中所有人的年龄加一岁,该怎样查询?

  F查询

    F查询专门对对象中某列值的操作,不可使用_双下划线!

  Q查询

    Q()可以使orm的fifter()方法支持, 多个查询条件,使用逻辑关系(&、|、~)包含、组合到一起进行多条件查询

    Q查询可以组合使用“&”,“|”操作符,当一个操作符是用两个Q的对象,他产生了一个新的Q对象,Q对象可以用“~”操作符放在前面表示否定

    也可允许否定与不否定形式的组合。Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。

    语法:

      fifter(Q(查询条件1)| Q(查询条件2))

      fifter(Q(查询条件2)& Q(查询条件3))

      fifter(Q(查询条件4)& ~Q(查询条件5))

      fifter(Q(查询条件6)| Q(Q(查询条件4)& ~ Q(Q(查询条件5)& Q(查询条件3)))包含

    Q查询和非Q查询条件混合使用注意,不包括Q()的查询条件一点要放在Q(查询条件)后面

分组和聚合查询

    1、aggregate(*args,**kwargs)  聚合函数

       通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中每一个参数都指定一个包含在字典中的返回值。即在查询集上生成聚合。

    2、annotate(*args,**kwargs)  分组函数

  extra

    extra针对的是复杂的SQL语句

    select select_params   

      1 v = models.UserInfo.objects.all().extra(select={
      2         'n': "select count(1) from app01_userinfo WHERE id>%s"
      3     },
      4     select_params=[1,]   # 有多个% 内部就有多个参数
      5     )
      6     print(v)
      7     for item in v:
      8         print(item.id,item.name,item.n)  # 这里使用n

    where params  

      1 models.UserInfo.objects.extra(
      2         where=["id=1","name='aaa'"]
      3     )
      4     models.UserInfo.objects.extra(
      5         where=["id=1 or id=%s ","name=%s"],
      6         params=[1,"aaa"]
      7     )

    tables

      1 models.UserInfo.objects.extra(
      2         tables=['app01_usertype'],
      3     )
      4 # """select * from app01_userinfo,app01_usertype"""
    总结:
       1 # a. 映射
       2     # select 
       3     # select_params=None
       4     # select 此处 from 表
       5 
       6 # b. 条件
       7     # where=None
       8     # params=None,
       9     # select * from 表 where 此处
      10 
      11 # c. 表
      12     # tables
      13     # select * from 表,此处
      14     
      15 # c. 排序
      16     # order_by=None
      17     # select * from 表 order by 此处
  原生SQL
    Django内部提供了写原生SQL的方法
     在setting中配置
     connection.cursor()默认是default数据
     cursor=connection['db2'].cursor()可以定义自己的数据库
        1 from django.db import connection, connections
        2 
        3 cursor = connection.cursor() #默认 connection=default数据库
        4 cursor = connections['db2'].cursor()
        5 
        6 cursor.execute("""SELECT * from auth_user where id = %s""", [1])# 写原生SQL
        7 
        8 row = cursor.fetchone()
        9 row = cursor.fetchall()  
 
      

    

    

原文地址:https://www.cnblogs.com/jacky912/p/10450854.html