一、聚合查询aggregate

  1. 利用聚合函数(Avg, Sum, Max, Min, Count)查询,返回一个字典
  2. 默认字典的键的名称是字段__聚合函数名,也可以自定义
from django.db.models import Max,Min,Sum,Avg,Count

# 1.筛选出价格最高的书籍的
res = models.Book.objects.aggregate(mr = Max('price'))
print(res)
# 2.求书籍总价格
res = models.Book.objects.aggregate(sm = Sum('price'))
print(res)
# 3.求书籍平均价格
res = models.Book.objects.aggregate(av = Avg('price'))
print(res)
# 4.一起使用
res = models.Book.objects.aggregate(Max('price'),Min('price'),Sum('price'),Count('price'),Avg('price'))
print(res)

二、分组查询annotate

  1. 一般和聚合查询联用,相当于sql语句中的group by
  2. annotate前面是分组的依据,括号内的是聚合函数
  3. values中的参数是要查询的字段
  4. filter的参数相当于where或者having
from django.db.models import Max,Min,Sum,Avg,Count

# 1.统计每一本书的作者个数 书名 和对应的作者人数
res = models.Book.objects.annotate(author_num=Count('authors__id')).values('title','author_num')
print(res)

# 2.统计出每个出版社卖的最便宜的书的价格  出版社的名字 价格
res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name','min_price')
print(res)

# 按照其他字段分组
res = models.Publish.objects.values('想要分组的字段名').annotate(min_price=Min('book__price')).values('name','min_price')
print(res)

# 3.统计不止一个作者的图书
# 1.先拿书及对应的作者数
# 2.再筛选出大于一的图书  书名 作者数目
res = models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1).values('title','author_num')
print(res)

# 4.查询各个作者出的书的总价格  作者名字  总价格
res = models.Author.objects.annotate(sum_price=Sum('book__price')).values('name','sum_price')
print(res)

三、F与Q查询

(一)F查询

  1. F可以指代对象自己,通过F('字段名')来取出对象自己的字段值来进行比较

  2. 如果修改char字段只能使用Concat, 参数位置决定了拼接是在头部拼接还是尾部拼接,Value里面是要新增的拼接值

    ```python
    from django.db.models import F,Q

1. 查询库存数大于卖出数的书籍

res = models.Book.objects.filter(kun_cun__gt = F('mai_cun')).values('title') # 后面的条件是来自于数据库的其他字段值

2. 将所有书的价格上涨100块

models.Book.objects.all().update(price=F('price') + 100)

3.将所有书的名称后面全部加上 "爆款" 后缀(操作字符串数据需要借助于Concat方法)

from django.db.models.functions import Concat
from django.db.models import Value
ret3 = models.Book.objects.update(title=Concat(F('title'), Value('新款')))
```

(二)Q查询

(1)正常查询

  1. 可以提供逻辑语句(OR,NOT,AND)
  2. AND:符号&,默认为AND
  3. OR:符号|
  4. NOT:符号~
from django.db.models import Q

# 1.查询一下书籍名称是三国演义 或者 库存数是500的书籍
res = models.Book.objects.filter(title='三国演义',kun_cun=500)  # and关系
res = models.Book.objects.filter(Q(title='三国演义'),Q(kun_cun=500))  # Q包裹之后逗号还是and关系
res = models.Book.objects.filter(Q(title='三国演义') | Q(kun_cun=500))  #  |就是or的关系
res = models.Book.objects.filter(~Q(title='三国演义') | Q(kun_cun=500))  #   ~就是not关系

(2)按照字符串查询

  1. connector:默认是and关系,可以修改成or
  2. .children.append:查询条件追加,列表类型
from django.db.models import Q
q = Q()
q.connector = 'or'  # 默认是and  可以改成or
q.children.append(('title','三国演义'))
q.children.append(('kun_cun__gt',500))
res = models.Book.objects.filter(~q)  # 取反

四、ORM字段及参数

(一)常用字段

  1. CharField :MySQL中的varchar类型,必须提供max_length参数, max_length表示字符长度。

  2. IntegerField:MySQL中的int类型

  3. BigIntegerField:MySQL中的bigint类型

  4. EmailField:MySQL中的varchar(254)类型

  5. DateField:日期字段,相当于 Python中的datetime.date()

  6. DateTimeField: 日期时间字段,相当于Python中的datetime.datetime()

    • 参数

      auto_now:每次修改数据的时候 都会自动将当前修改时间更新上去 实时更新

      auto_now_add:在创建数据的时候 会将当前时间自动记录,之后不会自动修改 除非人为修改

  7. AutoField: int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列

  8. BooleanField:布尔值,该字段在存储的时候 你只需要传布尔值True或False,它会自动存成1/0

  9. TextField:专门用来存大段文本

  10. FileField:专门用来存储文件路径

    upload_to = '路径',给该字段传值的时候 直接传文件对象,会自动将文件对象保存到upload_to后面指定的文件路径中,然后将路径保存到数据库

  11. DecimalField(Field):10进制小数

    • 参数:
      max_digits,小数总长度
      decimal_places,小数位长度

(二)通用参数

(1)null

用于表示某个字段可以为空。

(2)unique

如果设置为unique=True 则该字段在此表中必须是唯一的 。

(3)db_index

如果db_index=True 则代表着为此字段设置索引。

(4)default

为该字段设置默认值。

(三)自定义char字段

from django.db import models

class MyCharField(models.Field):  # 名字随便取
    def __init__(self,max_length,*args,**kwargs):
        self.max_length = max_length
        super().__init__(max_length=max_length,*args,**kwargs)  # 重新调用父类的方法

    def db_type(self, connection):  # 向MySQL交互返回char(长度)
        return 'char(%s)'%self.max_length

五、ORM中的事务操作

事务的定义:将多个sql语句操作变成原子性操作,要么同时成功,有一个失败则里面回滚到原来的状态,保证数据的完整性和一致性

from django.db import transaction

with transaction.atomic():
    # 在缩进的代码中书写数据库操作
    # 该缩进内的所有代码 都是一个事务
    pass

(day54)六、事务、分组、F、Q、常用字段、事务的更多相关文章

  1. ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化

    聚合函数 名称 作用 Max() 最大值 Min() 最小值 Sum() 求和 Count() 计数 Avg() 平均值 关键字: aggregate 聚合查询通常都是配合分组一起使用的 关于数据库的 ...

  2. 聚合和分组F,Q和事物,cookie,session

    聚合 aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典. 键的名称是聚合值的标识符,值是计算出来的聚合值.键的名称是按照字段和聚合函数的名称自动生成出 ...

  3. Django聚合分组查询、常用字段

    首先回顾sql中聚合和分组的概念: 如果没有分组,会把整张表作为一个大组,查询字段必须是聚合结果:如果有分组,分组之后,必须要使用聚合的结果作为having的条件. 聚合查询 聚合:aggregate ...

  4. orm中的聚合函数,分组,F/Q查询,字段类,事务

    目录 一.聚合函数 1. 基础语法 2. Max Min Sum Avg Count用法 (1) Max()/Min() (2)Avg() (3)Count() (4)聚合函数联用 二.分组查询 1. ...

  5. $Django 聚合函数、分组查询、F,Q查询、orm字段以及参数

        一.聚合函数    from django.db.models import Avg,Sum,Max,Min,Count,F,Q   #导入    # .查询图书的总价,平均价,最大价,最小价 ...

  6. django----聚合查询 分组 F与Q查询 字段 及其 参数

    目录 一.orm补充查询 聚合查询 1-1 分组查询 1-2 F与Q查询 1-3 二. 字段及其参数 常用字段 AutoField IntegerField CharField DateField D ...

  7. Django-ORM之聚合和分组查询、F和Q查询、事务

    聚合查询 聚合对查询的结果进行一步的计算加工. aggregate()是QuerySet 的一个终止子句 ,他的作用是,返回一个包含一些键值对的字典.键的名称是聚合值的标识符,值是计算出来的聚合值.键 ...

  8. Django之F、Q查询,事务,自定义char字段

    F查询 from django.db.models import F,Q # 当查询条件来自于数据库的某个字段,这个时候就必须使用F # 查询卖出数大于库存数的商品 res = models.Prod ...

  9. ORM之自关联、add、set方法、聚合函数、F、Q查询和事务

    一.外键自关联(一对多) 1.建表 # 评论表 class Comment(models.Model): id = models.AutoField(primary_key=True) content ...

随机推荐

  1. EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)

    传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...

  2. 6. java 方法

    一.方法定义格式 修饰符 返回值类型 方法名称(参数类型 参数名称, ...){ 方法体; return 返回值; } 1. 修饰符:现阶段固定写法,public static 2. 参数如果有多个, ...

  3. Python学习一、一个小例子

    一.题目: 对于一串氨基酸序列(由字母表前二十个大写字母组成),需要得到每一个氨基酸数目,然后输出到文件夹D:\test\frq.txt,要求用循环和字典实现. 氨基酸序列如下: ABCDEFGHIJ ...

  4. 如何使用postman判断返回结果是否正确

    针对一个接口,我们在知道参数以及参数对应的结果时,可以通过postman进行判断,验证返回数据是否与预期数据相等.这样可以使我们的接口测试更加的方便简洁. 1.准备数据. postman可以接受的文件 ...

  5. LG1879 「USACO2006NOV」Corn Fields 状压DP

    问题描述 LG1879 题解 设\(opt[i][j]\)代表前\(i\)行,且第\(i\)行状态为\(j\)的方案数. 枚举\(j\),再枚举\(k\),\(k\)为上一行的状态. 判断\(j,k\ ...

  6. CF1244F Chips

    题目链接 problem 有一个长度为\(n\)个点连成的环.每个点为黑色或白色.当一个点和与他相邻的两个点颜色不同时.该点的颜色就会改变. 问改变\(K\)次后每个点的颜色. solution 发现 ...

  7. umi+dva+antd新建项目(亲测可用)

    首先全局安装dva+umiumi:npm install -g umidva:npm install -g dva-cli 通过脚手架创建项目 一: mkdir myapp && cd ...

  8. python接口自动化12-pytest前后置与fixture

    前言 我们都知道在自动化测试中都会用到前后置,pytest 相比 unittest 无论是前后置还是插件等都灵活了许多,还能自己用 fixture 来定义.(甩 unttest 半条街?) 首先了解一 ...

  9. Linux 部署redis集群

    下载Redis 下载网址 http://www.redis.cn/download.html Redis需要gcc环境(如果已经有该环境跳过此步骤) yum install gcc-c++ 安装Red ...

  10. js判断undefined和null

    js判断undefined var exp = undefined; if (typeof(exp) == "undefined") { alert("undefined ...