10ジャンゴ集計クエリとクエリパケット

まず、集計クエリ

(集約関数のクエリを使用して)集計は:aggregate()ですQuerySet、それはキーと値のペアの数が含まれている辞書を返すことを意味し、終了句。

集計値は、キー識別子の名前であり、値が集計値を計算します。キーの名前は、自動的に名前フィールドと集計機能に応じて生成されます。

使用組み込み関数:from django.db.models import Avg,Sum,MAx,Min,Count

例:

form django.db.models import Avg,Sum,MAx,Min,Count
# 假设我们已经有书这张表了
# 查询所有的书的平均价格
models.Boook.objects.all().aggregate(Avg('prince'))
{'price__avg': xxxx}

あなたが集計値の名前を指定したい場合は、それが集約句に提供することができます。

models.Book.objects.aggregate(average_price=Avg('price'))
{'average_price': xxxx}

複数の集計を生成したい場合は、することができますaggregate()別のパラメータ句を追加します。あなたは最大値と最小値の価格のすべての書籍を知りたいのであれば、それは、クエリすることができます:

models.Book.objects.all().aggregate(Avg("price"), Max("price"), Min("price"))
{'price__avg': xxx, 'price__max': Decimal('19.90'), 'price__min': Decimal('9.90')}

第二に、クエリをグループ化します

ネイティブSQL文がグループ化されたものを一緒に、最初の口コミ

会社員のテーブルがあることを今仮定します。

IMG

我々は、セクター平均の賃金に応じてグループ化され、ネイティブのSQLステートメントを使用します:

select dept Avg(salary) from employee group by dept

ORMクエリ:

from django.db.models import AVG
Employee.objects.values("dept").annotate(avg=Avg('salary')).values(dept,'dept_avg')
这里需要注意的是annotate分组依据就是他前面的值,
如果前面没有特点的字段,则默认按照ID分组,
这里有dept字段,所以按照dept字段分组

でも、テーブル、クエリパケット:

IMG

問い合わせへのネイティブSQL文

select dept.name,Avg(salary) from employee inner join dept on(employee.dept_id=dept.id) group by dept_id

ORMクエリ:

from django.db.models import AVG
models.Dept.objects.annotate(avg=Avg("employee__salary")).values("name", "avg")

例コレクション

示例1:统计每本书的作者个数
book_list = models.Book.objects.annotate(num=count('author_id')).value('name',"num")
for obj in book_list:
    print(obj.author_num)
    
示例2:统计出每个出版社最便宜的书的价格
#方法一:
publisher_list = models.Publisher.objects.annotate(min_price=Min("book__price"))
for obj in publisher_list:
    print(obj.min_price) 
    
#方法二:
models.Book.objects.values("publisher__name").annotate(min_price=Min("price"))


示例3:统计不止一个作者的图书
book_obj=models.Book.objects.annotate(author_num=Count("author")).filter(author_num__gt=1)
print(obj)

示例4.查询各个作者出的书的总价格
res = models.Author.objects.annotate(price_sum = Sum("book__price")).values("price_sum")
print(res)

示例5:根据一本图书作者数量的多少对查询集 QuerySet进行排序
 models.Book.objects.annotate(author_num=Count("author")).order_by("author_num") 

概要

パラメータの値に対応する選択表示欄を見つけるために、SQL文の中にあります、

パラメータに対応するか、内部どこを有するフィルタリングするフィルタ

上記に基づいてパケットを見つけ、効果を注釈自体によって基を表し、フィルタ続いディスプレイ内部に配置された重合の発現は、制限を増加させるために使用されてもよい、パケットフィールドの値を表すために、最終的な値を検索します

IMG

おすすめ

転載: www.cnblogs.com/xichenHome/p/11748010.html