zoukankan      html  css  js  c++  java
  • day 56

    聚合查询

    aggregate()QuerySet()的一个终止子句,返回一个包含一些键值对的字典

    导入聚合函数 :from django.db.models import Avg,Sum,Max,Min,Count

    级联更新 级联删除 外键字段带来的约束

    res = models.Book.objects.aggregate(mr = Max('price'))

    print(res)

    分析:操作外键字段数据的时候,书跟出版社是一对多的关系,外键在书的表中(外键字段最多的表中),如果你把出版社删除了,所对应的书也会自动删除 对应的

    这时候如果你把出版社主键值改变了 书籍表中对应的出版社主键值也跟着改变

    注意:聚合函数必须用在分组之后,没有分组其实默认整体就是一组

    分组查询

    group by

    关键字 annotate

    和聚合函数一起使用

    例题:统计每一本书的作者个数 书名 和对应的作者人数

    res = models.Book.object.annotate(author_num=Count('aothors__id')).values('title','author_num')

    annotate本身表示的是group by 的作用,前面找寻分组依据,内部放置显示可能用到的聚合运算式,后面跟filter来增加限制条件,最后的value来表示分组后想查找的字段值

    F与Q查询

    导入模块 from django.db.models import F,Q

    F能够获取表字段所对应的值,有两种关系,andor

    例题:查询库存数大于卖出数的书籍

    res = models.Book.object.filter(ku_cun__gt = F('mai_chun')).values('title')

    后面可以跟其他字段的值

    from django.db.models.functions import Concat 操作字符串需要借助于Concat方法

    例题:将所有书的名称后面全部加上"新款"后缀

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

    Q查询

    默认是and关系

    例题:查询书籍名称是三国演义 或者 库存数是500的书籍

    and关系:

    res = models.Book.object.filter(title='三国演义',ku_cun = 500)    
    

    Q包裹之后and关系:

    res = models.Book.object.filter(Q(title='三国演义'),Q(ku_cun = 500)) 
    

    |表示或(or)的关系

    res = models.Book.object.filter(Q(title='三国演义')|Q(ku_cun = 500))
    

    ~表示的是not关系

    res = models.Book.object.filter(~Q(title='三国演义')|Q(ku_cun = 500))
    

    Q的高级用法

    q = Q()
    q = connector = 'or'   默认是and   可以改成or
    q.children.append(('title','书的名字'))
    q.children.append(('ku_cun__gt',500))
    res = models.Book.objects.filter(~q)   相反
    print(res)
    

    ORM字段及参数

    CharFied    varchar  
    IntegerField     int
    BigIntegerField   bigint  
    EmailField       varchar(254)
    DateField     
    DateTimeField   
        auto_now :实时更新时间
        auto_now_add:在创建数据的时候   会当前时间自动记录   不会修改  除非认为修改
    AutoField   auto_increment  
    BooleanField   布尔值
    该字段在存的时候 是True  或   False
    它会自动存成        1   或     0
    TextField   存大文件路径
    upload_to = 'a.txt'
    该字段传值的时候  直接传文件对象
    会自动将文件对象保存到upload_to 后面指定的文件路径中
    然后将路径保存到数据库中
    DecimalField
    10进制小数
    参数:max_digits,小数总长度
    decimal_places,小数位数长度
    ImageField  上传图片
    upload_to = ""  上传图片的路径
    storage  = None  存储组件,默认django.core.files.storage.FielSystemStorage
    width_field = None  上传图片的高度保存的数据库字段名(字符串)
    height_field = None  上传图片宽度保存的数据库字段名(字符串)
    UUIDField   字符串类型  ,Django Admin以及ModelForm中提供对UUID格式的验证
    protocol  用于指定IPV4或IPV6,'both',"ipv4","ipv6"
    unpack_ipv4   如果指定为True  则输入:fff:192.0.2.1的时候,可解析为192.0.2.1,开启此功能需要Protool= 'both'
    IPAddressField  字符串类型  提供IPV4的验证机制
    

    对应关系

    对应关系:
        'AutoField': 'integer AUTO_INCREMENT',
        'BigAutoField': 'bigint AUTO_INCREMENT',
        'BinaryField': 'longblob',
        'BooleanField': 'bool',
        'CharField': 'varchar(%(max_length)s)',
        'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
        'DateField': 'date',
        'DateTimeField': 'datetime',
        'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
        'DurationField': 'bigint',
        'FileField': 'varchar(%(max_length)s)',
        'FilePathField': 'varchar(%(max_length)s)',
        'FloatField': 'double precision',
        'IntegerField': 'integer',
        'BigIntegerField': 'bigint',
        'IPAddressField': 'char(15)',
        'GenericIPAddressField': 'char(39)',
        'NullBooleanField': 'bool',
        'OneToOneField': 'integer',
        'PositiveIntegerField': 'integer UNSIGNED',
        'PositiveSmallIntegerField': 'smallint UNSIGNED',
        'SlugField': 'varchar(%(max_length)s)',
        'SmallIntegerField': 'smallint',
        'TextField': 'longtext',
        'TimeField': 'time',
        'UUIDField': 'char(32)',
    
    ORM字段与MySQL字段对应关系
    

    13个字段操作总结

    返回QuerySet对象的方法
    all()
    filter()
    exclude()
    order_by()
    reverse()
    distinct()
    
    特殊的Queryset
    values()       返回一个可迭代的列表套字典序列
    values_list()  返回一个可迭代的列表套元组序列
    
    返回具体的对象
    get()
    first()
    last()
    
    返回布尔值的方法
    exists()
    
    返回数字的方法
    count()
    

    自定义char字段

    class MyCharField(models.Field):
       def __int__(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'
    

    ORM中事物的操作

    什么是事务

    指的是一组操作,要么全部执行成功,要么全部执行失败

    django中如何开启事务

    from django.db import transaction
    
      try:
    	with transaction.atomic():
       数据库操作
       缩进里面所有的代码   都是一个事务
       
       创建一条订单数据
       models.Order.objects.create(num="10101010",product_id = 1,count=1)
       能执行成功
       models.Product.objects.filter(id=1).update("kucun")-1,
    maichu=F("maichu")+1)
     except Exception as e:
     print(e)
    

    四大特性:

    原子性:不能再次分的事务,要么全部执行,要么全部取消

    一致性:指事务发生前和发生后,数据的总额依然不变 转账实例

    隔离性:事务与事务操作之间是独立不可见的

    持久性:当事务完成后,其影响应该留下来,不能撤销,只能通过“补偿性事务”来抵消之前的错误

    存储引擎

    InnoDB:支持事务,MyISAM不支持

    MyIsam:支持行锁,MySAM支持的表锁

    MEMORY:将表中的数据存储到内存中,为了查询和引用其他表数据提供快速的查询

    三大数据存储引擎的特性:

    InnoDB: 支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。

    MyISAM: 插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。

    MEMORY: 所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

    数据库三大范式

    第一范式:无重复的域

    第二范式:在第一范式的基础上属性完全依赖于主键

    第三范式:属性不依赖于其他非主属性,也就是在满足2的基础上,任何非主属性不得传递依赖于主属性

  • 相关阅读:
    php单元测试
    git配置本地环境(phpstudy/tortoisegit/git等)
    xp/win7中系统安装memcached服务,卸载memcached服务,以及删除memcached服务
    memcached装、启动和卸载
    如何安装memcached
    三元运算符、逻辑运算符
    移动端页面怎么适配ios页面
    javascript正则表达式——元字符
    一个div添加多个背景图片
    GNU Screen使用入门
  • 原文地址:https://www.cnblogs.com/gfhh/p/11954821.html
Copyright © 2011-2022 走看看