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

トランザクションとは何ですか

トランザクションは、一連の操作を意味し、成功か失敗のどちらかが実行され、実行されます

取引の特徴

アトミック:細分化されていないトランザクション、いずれかのすべての実行またはフルキャンセル

C一貫性が:まだ試合前に、総データを送信した後に起こったものを指し、

Iの単離:簡単に言えば、その他の事項には見えない何かの操作

D永続性:トランザクションが完了すると、その衝撃が保持されるべきであるが、元に戻すことができない、それだけで、以前のトランザクションエラーを補償することによって補償することができます

roolback():状態にロールバック

ストレージエンジン

InnoDBは:サポートサービス、サポートの行ロックは、粒子タイプを探して

Mylsam:トランザクションをサポートしていませんが、テーブルロックをサポートしています

どのようにジャンゴオープン情勢

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

おすすめ

転載: www.cnblogs.com/hj59988326/p/11952930.html