django ORM 高级用法

F 对象与Q对象

  • F 对象

    • 一个F对象代表数据库中某条记录的字段的信息

      • 通常是对数据库中字段值在图获取的情况下进行操作
      • 用于类属性(字段)之间的比较
    • 语法

      from django.db.models import F
      F('列明')
      
    • 实例:更新Book实例中所有的零售价涨10块

      使用F对象,不用获取对象的值使 现有的值+=10
      Book.objects.all().update(market_price=F('market_price')+10)
      # update bookstore_book set market_price = (bookstore_book.market_price +10)
      
      # 未使用F对象,先获取每个对象的值,再加10后再存入数据库 
      books = Book.objects.all()
      for book in books:
      	book.market_price=book.marget_price+10
      	book.save()
      
      
  • Q对象

    • 当获取查询结果集使用复杂的逻辑或 |、逻辑非 ~等操作是可以借助与Q对象来进行操作

    • Q对象在数据包django.db.models中,需要先导入在使用

      # 找出价格低于20 或清华大学出版社的全部图书
      Book.objects.filter(Q(price__lt=20)|Q(pub='清华大学出版社'))
      
    • 在条件中来实现除 and&以外的or|或not~操作

    • 运算符

      • & 与操作
      • | 或操作
      • ~ 非操作
    • 语法:

    • Q(条件1) | Q(条件2)  # 条件1成立 或 条件2成立
      Q(条件1) & Q(条件2)  # 条件1成立 并且 条件2成立
      Q(条件1) | Q(条件2)  # 条件1成立 并且 条件2不成立
      

    聚合查询和原生数据库操作

    • 聚合查询是指针对一个数据表中的字段和数据进行部分或全部进行统计查询,

      • 聚合查询分为 整表聚合【aggregate】 分组聚合【annotate】
    • 不带分组的聚合查询是指将全部数据进行几张统计查询

      • 导入包: from django.db.models import *
      • 聚合函数: Sum, Avg,Count,Max,Min
      • 语法: MyModel.objects.aggregate(结果变量名=聚合函数('列'))
      • 返回结果: 结果变量名和值组成的字典
    • 分组聚合是指通过计算查询结果中每一个对象所关联的对象集合,从而计算出的值,即为查询集的每一项生成聚合

      • 语法QuerySet.annotate(结果变量名=聚合函数('列'))
      • 返回值:QuerySet
    • Django 也可以支持直接用sql语句的方式通信数据库

      • 查询MyModel.objects.raw()进行数据库查询操作
      • 语法: MyModel.objets.raw(sql语句,拼接参数)
      • 返回值:RawQuerySet集合【只支持基础操作,比如循环】
    • 原生数据库操作-cursor

    • 完全跨过模型类操作数据库 查询更新删除

      • 导入cursor所在的包from django.db import connection

      • 用创建cursor类的构造函数创建cursor对象,在世用cursor对象

        from django.db import connection
        with connection.cursor() as curs:
        	curs.execute('sql语句','拼接参数')
        
posted @ 2021-06-20 21:22  不归路~  阅读(261)  评论(0)    收藏  举报