zoukankan      html  css  js  c++  java
  • django----聚合查询 分组 F与Q查询 字段 及其 参数

    一.orm补充查询

    聚合查询 1-1

    Max Min Sum Avg Count

    ​ 在mysql中聚合函数必须用在分组之后的 没有分组其实默认整体就是一组

    ​ 在django中如果想使用聚合函数必须先使用 关键字 aggregate

    ​ 还需要导入模块

    from django.db.models import Max, Min, Avg, Sum, Count
    # 温馨提示 只要跟数据库有关的功能 基本都在 db.models里面 或者 db里面
    

    ​ 使用方法:

    1.赛选出价格最高的书籍
    book_obj = models.Book.object.aggregate(mr=Max('price'))
    print(book_obj) # 拿到是一个字典 key为mr mr就是价格
    2.求书籍总价
    book_obj = models.Book.object.aggregate(sm=Sum('price'))
    print(book_obj) # {'sm': Decimal('15999.99')}
    3.全部一起使用 # 不起名字
    book_obj = models.Book.object.aggregate(Max('price'),Sum('price'),..... )
    # 返回字典的key 是 查询的字段+__聚合函数
    

    分组查询 1-2

    ​ mysql中使用的group_by

    ​ 那么什么时候需要分组? 例如:统计每个部门的平均薪资 统计每一个部门的男女比例

    ​ django里面使用分组: 1.关键字 annotate

    ​ 2.借助于聚合函数

    from django.db.models import Max, Min, Avg, Sum, Count
    
    # 统计每一本书的作者个数
    res = models.Book.objects.annotate(author_nmu=Count('authors__id'))
    print(res) # 返回queryset对象 是个列表
    # 统计每一本书的作者个数 书名 和 数量
    res = models.Book.objects.annotate(author_num=Count('authors__id')).values('title',author_num)
    # author_num 指代的就是作者的个数
    
    # 统计出每个出版社卖的最便宜的价格 出版社名称 图书书名
    res = models.Publish.objects.annotate(mi=Min('book__price')).values('name', 'book__titile')
    

    ​ 严格模式 分组之后只能拿分组后的依据 如果想拿 必须通过聚合函数来获取

    ​ 可以取消严格模式

    # 统计不止一个作者的图书
    1. 先拿到书及对应的作者数 
    2. 赛选出大于一的图书
    res = models.Book.objects.annotate(author_num=Count('author')).filter(author_num__gt=1).values('title','author_num')
    print(res)
    
    # 统计各个作者的图书总价格 作者名字 价格
    res = models.Author.object.annotate(su=Sum('book_price')).values('name', 'su')
    

    ​ 想要分组的字段 之间点values

    res = models.Author.object.values('title')annotate(su=Sum('book_price')).values('name', 'su')
    

    F与Q查询 1-3

    # 模块导入
    from django.db.models import F
    # 1 查询库存数大于卖出数的书籍
    res = models.Book.objects.filter(kun_cun__gt=F('mai_chu')).values('title')
    # 后面的条件是来自于数据库的其他字段
    
    # 2 将所有书的价格上加100元
    res = models.Book.objects.all().update(price=F('price') + 100)
    
    # 3 所有书的书名后添加 爆款
    ret3 = models.Book.objects.update(title=Concat(F('title'), Value('新款')))
    # 字符串必须使用Concat 了解知识点
      from django.db.models.functions import Concat
        from django.db.models import Value
        ret3 = models.Book.objects.update(title=Concat(F('title'), Value('新款')))
    
    # 模块导入
    from django.db.models import Q
    # 查询一下书籍名称是三国演艺 或者 库存是500的书籍
    # filter 内只能是 and关系
    res = models.Book.objects.filter(Q(tilte='三国演义'), Q(kun_cun=500)) # , 号还是 and
    res = models.Book.objects.filter(Q(tilte='三国演义')|Q(kun_cun=500)) # | 就是 or
    res = models.Book.objects.filter(`Q(tilte='三国演义')|Q(kun_cun=500)) # not 关系 取反 esc下面的波浪
    

    ​ Q对象高级用法

    # 类似于搜索功能
    q = Q() # 生成对象
    q.children.append(('title', '三国演义')) # 一定要是元组
    q.children.append(('kun_cun', 500))
    res = models.Book.objects.filter(q) # 默认是 and关系
    res = models.Book.objects.filter(`q) # 取反
    # 方法 
    q.connector = 'or' # 指定为or (*******)
    
    

    二. 字段及其参数

    常用字段

    AutoField

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

    IntegerField

    ​ 一个整数类型,范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,)

    CharField

    ​ 字符类型,必须提供max_length参数, max_length表示字符长度。

    ​ 这里需要知道的是Django中的CharField对应的MySQL数据库中的varchar类型,没有设置对应char类型的字段,但是Django允许我们自定义新的字段,下面我来自定义对应于数据库的char类型

    # 自定义char字段
    from django.db import models
    class FixCharField(models.Field):
        def __init__(self, max_length, *args, **kwargs):
            self.max_length = max_length
            super(self, FixCharField).__init__(max_lenght=max_length, *args, **kwargs)
           
    	def db_type(self, connecion): # 让它db_type指定返回的是char字段
            return 'char(%s)'%self.max_length
        
       
    # 应用
    class Class(models.Model):
        id=models.AutoField(primary_key=True)
        title=models.CharField(max_length=32)
        class_name=FixCharField(max_length=16)
        gender_choice=((1,'男'),(2,'女'),(3,'保密'))
        gender=models.SmallIntegerField(choices=gender_choice,default=3)
    

    DateField

    日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。

    DateTimeField

    日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。

    字段集合

    AutoField(Field)
            - int自增列,必须填入参数 primary_key=True
    
        BigAutoField(AutoField)
            - bigint自增列,必须填入参数 primary_key=True
    
            注:当model中如果没有自增列,则自动会创建一个列名为id的列
            from django.db import models
    
            class UserInfo(models.Model):
                # 自动创建一个列名为id的且为自增的整数列
                username = models.CharField(max_length=32)
    
            class Group(models.Model):
                # 自定义自增列
                nid = models.AutoField(primary_key=True)
                name = models.CharField(max_length=32)
    
        SmallIntegerField(IntegerField):
            - 小整数 -32768 ~ 32767
    
        PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
            - 正小整数 0 ~ 32767
        IntegerField(Field)
            - 整数列(有符号的) -2147483648 ~ 2147483647
    
        PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
            - 正整数 0 ~ 2147483647
    
        BigIntegerField(IntegerField):
            - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
    
        BooleanField(Field)
            - 布尔值类型
    
        NullBooleanField(Field):
            - 可以为空的布尔值
    
        CharField(Field)
            - 字符类型
            - 必须提供max_length参数, max_length表示字符长度
    
        TextField(Field)
            - 文本类型
    
        EmailField(CharField):
            - 字符串类型,Django Admin以及ModelForm中提供验证机制
    
        IPAddressField(Field)
            - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
    
        GenericIPAddressField(Field)
            - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
            - 参数:
                protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
                unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"
    
        URLField(CharField)
            - 字符串类型,Django Admin以及ModelForm中提供验证 URL
    
        SlugField(CharField)
            - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
    
        CommaSeparatedIntegerField(CharField)
            - 字符串类型,格式必须为逗号分割的数字
    
        UUIDField(Field)
            - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
    
        FilePathField(Field)
            - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
            - 参数:
                    path,                      文件夹路径
                    match=None,                正则匹配
                    recursive=False,           递归下面的文件夹
                    allow_files=True,          允许文件
                    allow_folders=False,       允许文件夹
    
        FileField(Field)
            - 字符串,路径保存在数据库,文件上传到指定目录
            - 参数:
                upload_to = ""      上传文件的保存路径
                storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
    
        ImageField(FileField)
            - 字符串,路径保存在数据库,文件上传到指定目录
            - 参数:
                upload_to = ""      上传文件的保存路径
                storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
                width_field=None,   上传图片的高度保存的数据库字段名(字符串)
                height_field=None   上传图片的宽度保存的数据库字段名(字符串)
    
        DateTimeField(DateField)
            - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
    
        DateField(DateTimeCheckMixin, Field)
            - 日期格式      YYYY-MM-DD
    
        TimeField(DateTimeCheckMixin, Field)
            - 时间格式      HH:MM[:ss[.uuuuuu]]
    
        DurationField(Field)
            - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
    
        FloatField(Field)
            - 浮点型
    
        DecimalField(Field)
            - 10进制小数
            - 参数:
                max_digits,小数总长度
                decimal_places,小数位长度
    
        BinaryField(Field)
            - 二进制类型
    

    字段参数

    null

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

    unique

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

    db_index

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

    default

    为该字段设置默认值。

    DateField和DateTimeField

    auto_now_add

    配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。

    auto_now

    配置上auto_now=True,每次更新数据记录的时候会更新该字段。

    关系字段

    to

    设置要关联的表。

    to_field

    设置要关联的字段。

    on_delete

    当删除关联表中的数据时,当前表与其关联的行的行为。

    models.CASCADE

    删除关联数据,与之关联也删除

    db_constraint

    是否在数据库中创建外键约束,默认为True。

    吾虽浪迹,却未迷失本心
  • 相关阅读:
    Delphi XE4 FireMonkey 开发 IOS APP 发布到 AppStore 最后一步.
    Native iOS Control Delphi XE4
    Delphi XE4 iAD Framework 支持.
    using IOS API with Delphi XE4
    GoF23种设计模式之行为型模式之命令模式
    Android青翼蝠王之ContentProvider
    Android白眉鹰王之BroadcastReceiver
    Android倚天剑之Notification之亮剑IOS
    Android紫衫龙王之Activity
    GoF23种设计模式之行为型模式之访问者模式
  • 原文地址:https://www.cnblogs.com/lddragon1/p/11948986.html
Copyright © 2011-2022 走看看