码迷,mamicode.com
首页 > 其他好文 > 详细

11.28 总结

时间:2019-11-28 23:16:34      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:efi   bool   price   atomic   完整性   了解   1nf   objects   group by   

  • 级联更新 级联删除 外键字段带来的约束
    • 操作外键字段管理数据的时候, 出版社和书是一对多关系 外键字段在书那里
    • 如果把出版社删了 所对应的书也会自动删除
    • 如果把出版社主键值改了 书表中对应的出版社主键值也会自动随之更改

聚合函数

  • 必须用在分组之后,没有分组其实默认整体是一组
  • 关键字 aggregate
  • 用之前需要导入模块
from django.db.models import Max,Min,Sum,Avg,Count
  • 只要跟数据库相关的功能 基本上都在django.db.models里面
  • 如果不在 可能直接在django.db里面
from django.db.models import Max,Min,Sum,Count,Avg

    #筛选出价格最高的书籍
    res= models.Book.objects.aggregate(mr=Max('price'))
    print(res)

    #求书籍总价格
    res=models.Book.objects.aggregate(sm=Sum('price'))
    print(res)

    #书籍平均价格
    res=models.Book.objects.aggregate(av=Avg('price'))
    print(res)

    #合并使用
    res=models.Book.objects.aggregate(Max('price'),Min('price'),Sum('price'),Count('price'),Avg('price'))
    print(res)
    
运行结果:
{'price__max': Decimal('444.33'), 'price__min': Decimal('222.22'), 'price__sum': Decimal('999.89'), 'price__count': 3, 'price__avg': 333.296667}

分组查询

  • group by,什么时候需要分组
    • 统计每一个部门的平均薪资
    • 统计每一个部门的男女比例
    • 关键字 annotate
    • 借助于聚合函数
    • django中models后面.什么,就按照什么分组
#统计每一本书的作者个数 书名 和对应的作者人数 (正向按字段)
    res=models.Book.objects.annotate(author_num=Count('authors__id')).values('title','author_num')
    print(res)

    #统计出每个出版社卖的最便宜的书的价格  出版社的名字 价格
    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)
    
    #统计不止一个作者的图书
    #先拿书及对应的作者数  再筛选出大于一的图书 书名 作者数
    res=models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1).values('title','author_num')
    print(res)

F与Q查询

from django.db.models import F,Q
F能够获取表中字段所对应的值

from django.db.models import F,Q
    #查询库存数大于卖出数的书籍
    res=models.Book.objects.filter(inventory__gt=F('sold')).values('title')
    print(res)
    
    #将所有书的价格上涨100块
    models.Book.objects.all().update(price=F('price')+100)
    
    # 将所有书的名称后面全部加上 "爆款" 后缀    了解知识点    操作字符串数据需要借助于Concat方法
    from django.db.models.functions import Concat
    from django.db.models import Value
    models.Book.objects.update(title=Concat(F('title'),Value('新款')))
# 查询一下书籍名称是红楼梦 或者 库存数是500的书籍
    res=models.Book.objects.filter(Q(title='红楼梦')|Q(inventory=500)) #|是or关系
    res1=models.Book.objects.filter(~Q(title='红楼梦')|Q(inventory=500)) #~是not关系
    print(res,res1)
    
  #Q对象高级用法
    q=Q()
    q.connector='or' #默认是and 如果需要or关系就使用这行代码
    q.children.append(('title','红楼梦'))
    q.children.append(('inventory__gt',500))
    res=models.Book.objects.filter(q) #取反
    res1=models.Book.objects.filter(~q) #取反
    print(res)
    print(res1)

orm字段及参数

CharField     varchar
    IntegerField   int
    BigIntegerField   bigint
    EmailField    varchar(254)
    DateField
    DateTimeField
        auto_now:每次修改数据的时候 都会自动将当前修改时间更新上去  实时更新
        auto_now_add:在创建数据的时候 会将当前时间自动记录 之后不会自动修改  除非你人为修改
    
    AutoField     auto_increment   
    
    BooleanField    布尔值  
        该字段在存储的时候 你只需要传布尔值True或False
        它会自动存成1/0
    
    TextField  专门用来存大段文本
    
    FileField  专门用来文件路径   '/etc/data/a.txt'   
        upload_to = '/etc/data'
        给该字段传值的时候 直接传文件对象
        会自动将文件对象保存到upload_to后面指定的文件路径中
        然后将路径保存到数据库
    
    DecimalField(Field)
    - 10进制小数
    - 参数:
        max_digits,小数总长度
        decimal_places,小数位长度
  • 自定义char字段
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):
        return 'char(%s)'%self.max_length  #返回结果就是定义字段的类型

orm中的事务操作

事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤销。

  • 事务的四大特性

  • 数据库事务transaction正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。
    • 原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始的最初状态,就像这个事务从来没有执行过一样。
    • 一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
    • 隔离性:隔离状态执行事务,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。
    • 持久性:在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库中,并不会被回滚。
from django.db import transaction

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

数据库三大范式

  • 为了优化数据存储方式,所以应该规范化建立数据库,这些规范形成三大范式。
    • 第一范式:要求数据库表的每一列都是不可分割的原子数据项(1NF)
    • 第二范式:(1NF基础上)需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分有关(针对联合主键)(2NF)
    • 第三范式:(2NF基础上)需要确保数据库表中的每一列数据都和主键直接相关,而不能间接相关。

11.28 总结

标签:efi   bool   price   atomic   完整性   了解   1nf   objects   group by   

原文地址:https://www.cnblogs.com/lidandanaa/p/11954148.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!