56 Djangoのモデルレイヤ2

まず、集計クエリ

集計関数

これは、MAX、MIN、合計、平均、いくつかの機能をカウントしています。

重合パケット機能しなければならないの後、パケット全体がデフォルトセットではありません。

注意事項:

  1. キーワードを使用する必要が集約関数を使用します。aggregate

  2. 集計機能モジュールをインポートする必要があります

    (ロングとしてデータベースに関連付けられた機能であるとしてdjango.db.models内部;

    そうでなければ、かもしれdjango.db内側)

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

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

# 2.求书籍总价格
res = models.Book.objects.aggregate(sm = Sum('price'))
print(res)
# {'sm': Decimal('1286.30')}

# 3.求书籍平均价格
res = models.Book.objects.aggregate(av = Avg('price'))
print(res)
# {'av': 128.63}

# 4.一起使用
res = models.Book.objects.aggregate(Max('price'),Min('title'),Count('price'),Avg('price'))
print(res)
# {'price__max': Decimal('666.60'), 'title__min': '大主宰', 'price__count': 10, 'price__avg': 128.63}

第二に、グループ化するクエリ

とき私は、パケットが必要なのでしょうか?

1. 统计每一个部门的平均薪资
2. 统计每一个部门的男女比例

グループの照会でグループを使用します

注意事項:

  1. キーワードを使用するパケットの必要性:annotate

  2. 機能によっても重合が必要です

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

# models.哪个表名 ,就对哪个表分组


# 1.统计每一本书的作者个数 书名 和对应的作者人数
res = models.Book.objects.annotate(author_num=Count('authors__id')).values('title','author_num')
print(res)

# 2.统计出每个出版社卖的最便宜的书的价格  出版社的名字 价格
res = models.Publisher.objects.annotate(min_price=Min('book__price')).values('name','min_price')
print(res)

# 按照其他字段分组
res = models.Publisher.objects.values('addr').annotate(min_date=Min('book__publish_date')).values('name','min_date')
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とQの必要性は、最初に使用する前に導入します。

1. Fカテゴリ

表中のF値は、フィールドを対応する文字列で取得することができます。

# from django.db.models import F,Q

# 1. 查询库存数大于卖出数的书籍
# 后面的条件是来自于数据库的其他字段值
res = models.Book.objects.filter(kun_cun__gt = F('inventory')).values('title')
print(res)

# 2. 将所有书的价格上涨100块
models.Book.objects.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('新款')))

2. Qクラス

Qは、Qは、オブジェクト及びQはフィルタの他のオブジェクトによって決定される「しない」である「または」またはできるオブジェクト状態パラメータのクラスのインスタンスを渡すことができます。

# from django.db.models import F,Q

# Q包裹之后,用逗号还是and关系,默认就是为and2
res = models.Book.objects.filter(Q(title='三国演义'),Q(kun_cun=500))  

#  |就是or的关系
res = models.Book.objects.filter(Q(title='最终进化')| Q(price=500)) 
#  ~就是not关系
res = models.Book.objects.filter(~Q(title='星辰变')| Q(price=500))
print(res)


# Q对象高级用法
q = Q()
q.connector = 'or'  # 默认是and,改成or,内部就是在修改Q类的default值
q.children.append(('title','武动乾坤'))
q.children.append(('price__gt',500))
# 将两个条件添加进q对象中,直接比较q对象
res = models.Book.objects.filter(q)
res = models.Book.objects.filter(~q)  # 取反
print(res)

四、ORMフィールドとパラメータ

  1. CharFieldですVARCHAR

  2. IntegerFieldとint型

  3. BigIntegerField BIGINT

  4. EmailField VARCHAR(254)

  5. DateFieldに

  6. DateTimeField型

    • auto_now:各修正データを自動的に現在の変更時間の更新をライブアップデートを行くとき

    • auto_now_add:あなたは自動的に現在の時刻を記録する時間後に作成されたデータを変更しない限り、人工が自動的に変更されません。

  7. AutoField AUTO_INCREMENT

  8. BooleanFieldブール値
    • フィールドメモリを使用する場合は、それだけが自動的に1/0に保存され、ブールTrueまたはFalseを渡す必要が
  9. TextFieldには、テキストの大部分を維持するために設計されました

  10. FileFieldには、ファイルパス「/etc/data/a.txt」に設計されました

    • upload_to = 'は/ etc /データ'

    • フィールドの値が時間を渡すために、あなたは直接ファイルオブジェクトを転送することができます

    • 自動的upload_toの背後にある指定されたファイルパスにファイルオブジェクトを保存します

    • そして、データベースへのパスを保存

  11. DecimalFieldは(フィールド)

    • 小数小数

    • パラメータ:

      • 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

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

トランザクションは、アトミックSQL文のセット、または仕事の独立したユニットです。

データベースエンジンが正常にデータベースアプリケーションを照会し、すべてのステートメントは、クエリを実行することができます。

クラッシュやその他の理由の法的強制力がないとして、これらのステートメントのいずれかの場合は、すべてのステートメントは実行されません。

これは、トランザクション内の文で、どちらかのすべてが成功するか失敗する実行しました。

コンカーかが死にます。

2.四つの特性

  1. アトミック(不可分)

    トランザクション動作は、作業の最小単位の不可欠な部分としてみなされなければなりません。

    トランザクション全体のすべての操作はすべて正常に送信、またはすべてのロールバックに失敗のどちらか。

    トランザクションの場合は、運転中に一部だけを実行することは不可能です。

    これは、物事の原子です。

  2. 一貫性(一貫性)

    データベースは、常に別の一貫した状態に一貫性のある状態から変換されます。

    前と取引後のデータベース内のデータの合計量が一貫していることを確認してください。

  3. 絶縁(アイソレーション)

    単にトランザクションとトランザクションが隔離されている間、あること、置きます。

    会社の変更は、最終的な提出前に作られたというこの手段は、他のトランザクションは表示されません。

    最初の外観は、データの一部がトランザクションを開始するが、提出しなかったとき、と言うことです、別のトランザクションは、これらのデータを変更する必要があり、その後、トランザクションのバックは、データが変更されていない最初のものです見ました。

  4. 持続性(耐久性)

    トランザクションのコミットしたら、それはデータベースに永続的に保存されます作られた変更。

    システムがクラッシュした場合でも、変更されたデータが失われることはありません。

3.三つの形式

  1. 第1正規形

    各列のプロパティは、各列のアトミック性を確保し、属性値を細分化されていません。

  2. 第2正規形

    データの重複を避けるために、一次および関連する鍵の両方を保証するためにカラムの一方のみ、テーブルの各列に関連付けられたデータの各行。

  3. 第3正規形

    データ転送の関係は、主キー列に関連していること、存在しないことができ、直接ではなく間接的により、各列に関連しています。

おすすめ

転載: www.cnblogs.com/bowendown/p/11953971.html