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

1|0一、聚合函数

  • 聚合函数单独使用意义不大,一般与分组联用

  • 没有分组其实默认整体就是一组

  • 常用的聚合函数有:Max Min Sum Avg Count

1|11. 基础语法

  • 聚合函数要先导入才能使用

    from django.db.models import Max, Min, Sum, Count, Avg # 温馨提示:只要跟数据库相关的功能 基本上都在django.db.models里面 # 如果不在 可能直接在django.db里面
  • 用关键字aggregate实现

    例子:res = models.Book.objects.aggregate(mr = Max('price')) mr 为该聚合字段的名字,随便取。也可以不命名,django会自动命名为: 字段名__聚合函数名

1|22. Max Min Sum Avg Count用法

1|0(1) Max()/Min()

# 1.筛选出价格最高的书籍的 from django.db.models import Max, Min, Sum, Count, Avg res = models.Book.objects.aggregate(mr = Max('price')) res1 = models.Book.objects.aggregate(mr = Min('price'))

1|0(2)Avg()

# 2.求书籍总价格 from django.db.models import Max, Min, Sum, Count, Avg res = models.Book.objects.aggregate(sm = Sum('price'))

1|0(3)Count()

# 3.求书籍平均价格 from django.db.models import Max, Min, Sum, Count, Avg res = models.Book.objects.aggregate(av = Avg('price'))

1|0(4)聚合函数联用

# 4.一起使用 from django.db.models import Max, Min, Sum, Count, Avg res = models.Book.objects.aggregate(Max('price'),Min('price'),Sum('price'),Count('price'),Avg('price'))

2|0二、分组查询

  • 分组一般配合聚合函数使用

  • django中models后面点什么,就按照什么分组。若点的是模型类(表),则默认以该表的主键分组

  • 关键字:annotate

2|11. 分组查询实例

  • 以下查询到的都是queryset对象
# 1. 统计每一本书的作者个数 书名 和对应的作者人数 res = models.Book.objects.annotate(author_num=Count('authors__id')).values('title','author_num') # 2. 统计出每个出版社卖的最便宜的书的价格 出版社的名字 价格 res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name','min_price') # 3. 按照其他字段分组 res = models.Publish.objects.values('想要分组的字段名').annotate(min_price=Min('book__price')).values('name','min_price') # 4. 统计不止一个作者的图书 # 先拿书及对应的作者数 # 再筛选出大于一的图书 书名 作者数目 res = models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1).values('title','author_num') # 5. 查询各个作者出的书的总价格 作者名字 总价格 res = models.Author.objects.annotate(sum_price=Sum('book__price')).values('name','sum_price')

3|0三、F与Q查询

  • F与Q查询前要先导入才能使用

    from django.db.models import F,Q

3|11. F查询实例

  • 当条件中的运算符号的右边为表中其他字段时,使用F方法来组成该条件右边的部分。user_id > book_id 中的book_id
from django.db.models import F # 一定要先导入 # 1. 查询库存数大于卖出数的书籍 res = models.Book.objects.filter(ku_cun__gt = F('mai_chu')).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('新款')))

3|22. Q查询实例

  • Q查询主要用来改变条件与条件之间的逻辑关系。即 and/or/not
from django.db.models import Q # 一定要先导入 # 1.查询一下书籍名称是三国演义 或者 库存数是500的书籍 res = models.Book.objects.filter(title='三国演义',ku_cun=500) # and关系 res1 = models.Book.objects.filter(Q(title='三国演义'),Q(kun_cun=500)) # Q包裹之后逗号还是and关系 res = models.Book.objects.filter(Q(title='三国演义') | Q(ku_cun=500)) # |就是or的关系 res = models.Book.objects.filter(~Q(title='三国演义') | Q(ku_cun=500)) # ~就是not关系
  • Q方法的高级用法
from django.db.models import Q q = Q() q.connector = 'or' # 默认是and 可以改成or q.children.append(('title','三国演义')) # 放元组 , title='三国演义' : 原关键字参数变成了元组形式 q.children.append(('ku_cun__gt',500)) # 查询书名是三国演义或者库存数量大于500的书籍 res1 = models.Book.objects.filter(q) res2 = models.Book.objects.filter(~q) # 取反

4|0四、orm字段及其参数

4|11. 常见的orm字段

# 除了主键和外键字段外,所有字段中都有的参数 null=布尔值 表示是否可以为空 CharField varchar 参数: max_length IntegerField int BigIntegerField bigint EmailField varchar(254) DateField DateTimeField ''' DateField 和 DateTimeField 中都有两个参数 auto_now 和 auto_now_add,默认都是False auto_now:每次修改数据的时候,不管你有没有指定修改时间字段,时间字段都会自动将当前时间修改成这次修改的当前时间,即实时更新 auto_now_add:在创建数据的时候,会将当前时间自动记录,之后不会自动修改,除非你人为指定修改 ''' AutoField 参数:primary_key BooleanField 布尔值,后端传布尔值,但是数据库里对应的存 01 TextField 专门用来存大段文本 FileField 专门用来文件路径字符串 如:'/etc/data/a.txt' 参数: upload_to = 本地一个路径 给该字段传值的时候 直接传文件对象 会自动将文件对象保存到upload_to后面指定的文件路径中 然后将路径保存到数据库 DecimalField(Field) - 10进制小数 - 参数: max_digits,小数总长度 decimal_places,小数位长度

4|22. 自定义字段

  • 自定义char字段实例

    class MyCharField(models.Field): # 继承models中字段类 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): return 'char(%s)'%self.max_length

4|33. 外键字段

# 以其他表的主键字段当做外键,直接 to=类名 publish = models.ForeignKey(to='Publish') # 以其他表的其他字段为外键, 直接 to_Field=字段名 # 外键删除操作 如果一个模型使用了外键。那么在对方那个模型被删掉后,该进行什么样的操作。可以通过on_delete来指定。可以指定的类型如下: 如: on_delete=CASCADE 1.CASCADE:级联操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。 2.PROTECT:受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。 3.SET_NULL:设置为空。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空。 4.SET_DEFAULT:设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,前提是要指定这个字段一个默认值。 5.SET():如果外键的那条数据被删除了。那么将会获取SET函数中的值来作为这个外键的值。SET函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。 6.DO_NOTHING:不采取任何行为。一切全看数据库级别的约束

4|44. 字段中的常用属性

1. null 如果设置为True,Django将会在映射表的时候指定是否为空。默认是为False。在使用字符串相关的Field(CharField/TextField)的时候,官方推荐尽量不要使用这个参数,也就是保持默认值False。因为Django在处理字符串相关的Field的时候,即使这个Field的null=False,如果你没有给这个Field传递任何值,那么Django也会使用一个空的字符串""来作为默认值存储进去。因此如果再使用null=True,Django会产生两种空值的情形(NULL或者空字符串)。如果想要在表单验证的时候允许这个字符串为空,那么建议使用blank=True。如果你的Field是BooleanField,那么对应的可空的字段则为NullBooleanField。 2. db_column 这个字段在数据库中的名字。如果没有设置这个参数,那么将会使用模型中属性的名字。 3. default 默认值。可以为一个值,或者是一个函数,但是不支持lambda表达式。并且不支持列表/字典/集合等可变的数据结构。 4. primary_key 是否为主键。默认是False 5. unique 在表中这个字段的值是否唯一。一般是设置手机号码/邮箱等

5|0五、orm中的事务操作

  • 要先导入才能使用事务

    from django.db import transaction

5|11. 开启/关闭事务

# with 和文本操作中的with管理上下文功能一样,可以自动关闭事务 with transaction.atomic(): # 在缩进的代码中书写数据库操作 # 该缩进内的所有代码 都是一个事务 pass

__EOF__

本文作者BigSun丶
本文链接https://www.cnblogs.com/Mcoming/p/11953154.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   BigSun丶  阅读(329)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示