django ORM模型操作

聚合查询

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

操作外键字段管理数据的时候 
    书跟出版社是一对多关系 外键字段在书那儿
    这个时候如果你把出版社删了 所对应的书也会自动删除
    这个时候如果你把出版社主键值改变了 那么书籍表中对应的出版社主键值也会自动修改 

聚合函数

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

from django.db.models import Max,Min,Sun,Count,Avg

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

分组查询

"""
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:

'''
from django.db.models import F,Q
F:可以查询自身字段
 1. 查询库存数大于卖出数的书籍
    res=models.Book.object.filter(ku_cun__gt=F('price'))
 
 2. 将所有书的价格上涨100块
    res=models.Book.object.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:

'''
from django.db.models import Q
Q:自身字段的筛选与|,~ 一起
1.查询一下书籍名称是三国演义 或者 库存数是500的书籍
    res = models.Book.objects.filter(title='三国演义',kun_cun=500)  # and关系
    res = models.Book.objects.filter(title='三国演义',kun_cun=500)  # and关系
    
    # Q包裹之后逗号还是and关系
    res = models.Book.objects.filter(Q(title='三国演义'),Q(kun_cun=500))  
    
    res = models.Book.objects.filter(Q(title='三国演义') | Q(kun_cun=500))  #  |就是or的关系
    res = models.Book.objects.filter(~Q(title='三国演义') | Q(kun_cun=500)) #  ~就是not关系

Q对象的高级用法:
    q=Q()
    q.connector='or'    默认是and,可以改成or
    q.children.append(('title','三国演义'))
    q.children.append(('ku_cun',500))
    res=models.Book.object.filter(q)
'''

orm字段及参数

'''
CharField           varchar
IntegerField        int
BigIntegerField     bigint
EmailField          varchar(254)
DateField           Date
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) float

'''

自定义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中的事务

什么是事务

事务指一组操作,要么都执行成功要么都执行失败

事务的特性

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

C 一致性:指事物发生前和发送后,数据的总额依然匹配

I 隔离性: 简单点说,某个事物的操作对其他事务不可见的

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

roolback():回滚到上一个状态

存储引擎

innoDB:支持事务,支持行锁,颗粒型查找

Mylsam:不支持事务,支持表锁

django如何开启事务

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

猜你喜欢

转载自www.cnblogs.com/hj59988326/p/11952930.html