Django QuerySetステップアップ


    ,         :Python   。

QuerySetとは
QuerySetはDjangoが提供する強力なデータベースインタフェース(API)である.これにより、元のSQL言語でデータベースと対話する必要がなく、filter、exclude、getなどの方法でデータベースクエリーを行うことができます.データベースからクエリされた結果は一般的に1つの集合であり、この集合はquerysetと呼ばれます.
1. values_Listメタグループ形式の結果の取得
例えば、著者のnameとqqの2つのフィールドの情報を取得します.
authors = Author.objects.values_list(‘name’, ‘qq’)
2.values辞書形式の結果を取得
例えば、著者のnameとqqの2つのフィールドの情報を取得します.
authors = Author.objects.values(‘name’, ‘qq’)
注意:
  • values_Listとvaluesが返すのは本当のリストや辞書ではなくquerysetであり、lazy evaluationの
  • です(不活性評価、一般的には、実際にデータベースを調べるために使用されます).
  • クエリー後に使用されていない場合は、データベースが更新された後に使用され、新しいコンテンツであることがわかります!!!古いコンテンツを保持したい場合は、データベースの更新後は変更しないでください.リスト
  • これらの結果を巡回するだけであれば、リストに転送する必要はありません(メモリを浪費し、データ量が大きい場合はもっと慎重に!!)

  • 3.annotate集約カウント、合計、平均数など
    3.1カウント
    各著者の文章数を計算してみましょう
    Article.objects.all().values(‘author_id’).annotate(count=Count(‘author’)).values(‘author_id’, ‘count’)
    3.2平均
    作者のすべての文章の得点(score)の平均値を求めます
    Article.objects.values(‘author_id’).annotate(avg_score=Avg(‘score’)).values(‘author_id’, ‘avg_score’)
    3.3加算
    作者のすべての文章の総点を求めます
    Article.objects.values(‘author__name’).annotate(sum_score=Sum(‘score’)).values(‘author__name’, ‘sum_score’)
    4. select_relatedは、1対1、複数対1のクエリーを最適化します(データベースへのアクセスを減らす)
    1つの文章には1人の作者しかいません.
    articles = Article.objects.all().select_related(‘author’)[:10]
    5. prefetch_related最適化一対多,多対多クエリー
      select_related     ,      。select_related     SQL JOIN           。prefetch_related       ,       ,   select_related    ,                 。
    
    prefetch_related           SQL  ,    Python    SQL       (joining)   
    

    「記事」と「ラベル」は、複数対複数の関係です.
    articles = Article.objects.all().prefetch_related(‘tags’)[:10]
    6.defer不要なフィールドの除外
           ,             ,       Python           。
    
           defer        ,          ,           ,               (      python  ,    )
    

    Article.objects.all().defer(‘content’)#ここでcontentフィールドを調べていないことに注意してください
    7.only必要なフィールドのみ選択
    deferとは逆にonlyは必要なフィールドを取り出すために使用されます.もし著者の名前を調べるだけなら
    Author.objects.all().only(‘name’)