八、DjangoのORM多くのテーブル操作(B)

クエリ(フォーカス)

  1. 表にまたがるオブジェクトベースのクエリ - サブクエリに似て

前方および逆引き参照クエリ

関係は現在のクラスから、その内部テーブル書面で(フィールド)を属性(テーブル)データは、クエリを転送と呼ばれることクラス(テーブル)に関連付けられたデータを照会するために、およびその逆は、逆引きと呼ばれています

  • 一つのクエリ
    • フォワード・クエリ
      #1クエリjiegeアドレス
      author_obj = models.Author.objects.get(名= 'jiege')
      印刷(author_obj.authorDetail.addr)

      # 或者用filter这种查,但是要加.first()变成models对象,否则报错
      author_obj1 = models.Author.objects.filter(name='jiege').first()
      print(author_obj1.authorDetail.addr)
      
      # 正向 author_obj.authorDetail 也就是 对象.关联属性名称
    • 逆引き参照
      #2クエリ誰の誕生日1996年2月14日
      authordetail_obj = models.AuthorDetail.objects.get(誕生日= '1996年2月14日')
      印刷(authordetail_obj.author.name)

      # 反向 authordetail_obj.author  也就是 对象.小写的另一个表名(类名)
    • 要約
      著者表1の関連AuthorDetailテーブル

             正向查询:Authorobj.authorDetail,对象.关联属性名称
      Author------------------------------------------------->AuthorDetail
           <-------------------------------------------------
             反向查询:AuthorDetailobj.author  ,对象.小写类名
  • 多くのクエリには
    注意:テーブルは「多」であるテーブル内の関係フィールドは、関連付けられたテーブルが「1」であります
    • フォワード・クエリ
      によって公開されているこの本の彼らの村に戻るには#1クエリ誘惑
      book_obj = models.Book.objects.get(タイトル=「自分の村の誘惑に復帰」)
      印刷(book_obj.publish.name)

      # 正向 book_obj.publish  也就是 对象名.关联属性名称
    • 逆引き参照
      著書出版さ#2クエリ外交出版社
      publish_obj = models.Publish.objects.get(名=「フォーリン・プレス」)
      印刷(publish_obj.book_set.all())#<クエリセット[<帳yuhaoの回顧録>、<ブック:あなたJiegeウーリー>]>
      印刷(publish_obj.book_set.all()フィルタ(price__gt = 500)。)#<クエリセットその[<ブック:あなたJiegeウーリー>]>

      # 反向 publish_obj.book_set  也就是 对象.表名小写_set
      # 因为一个出版社可以对应很多书,所以用 book_set
      # 因为结果返回一个queryset对象,可以继续加 .方法
    • 要約
      ブック-many関連テーブル表を公開

             正向查询:book_obj.publish,对象.关联属性名称
      Book -------------------------------------------------> Publish
           <-------------------------------------------------
             反向查询:publish_obj.book_set.all(),对象.表名小写_set
  • 多くのクエリに多くの
    • フォワード・クエリ
      持っているこの本の#1クエリyuhaoの回顧録の著者
      book_obj = models.Book.objects.get(タイトル= 'yuhao回想録')
      印刷(book_obj.authors.all())#<クエリセットを[ <著者:jiege>、<著者 :yuhao>、<著者:liangdao>]>

      # 正向 book_obj.authors.all() 就是 对象.属性
    • 逆引き
      本が書かれている#2クエリliangdao
      author_obj = models.Author.objects.get(名= 'liangdao')
      印刷(author_obj.book_set.all())#<クエリセット[<ブックその:Yuhaoの回顧録> <ブック:手段13 2を作る方法>]>

      # 反向 book_obj.author_obj.book_set.all()  就是 对象.表名小写_set
    • 概要
      本の著者テーブル多くのアソシエーションテーブル

             正向查询:book_obj.authors.all(),对象.关联属性名称
      Book -------------------------------------------------> Author
           <-------------------------------------------------
             反向查询:author_obj.book_set.all(),对象.表名小写_set
  1. 参加似てさえテーブル - クロステーブルダブル下線の問い合わせに基づいて、

前方および逆引き参照クエリ

  • マンツーマン
    • アドレス問い合わせjiegeの
      #の実施例1:フォワード・クエリ
      OBJ = models.Author.objects.filter(名= 'jiege')の値( 'authorDetail__addr')。
      印刷(OBJ)#<クエリセット[{ 'authorDetail__addr'は「スカイ市「}]>

      # 方式2:反向查询
      obj1 = models.AuthorDetail.objects.filter(author__name='jiege').values('addr')
      print(obj1) # <QuerySet [{'addr': '天空之城'}]>
    • 2019--07--19どの著者の誕生日である
      フォワード問い合わせ:#1の方法
      。OBJ = models.Author.objects.filter(authorDetail__birthday = '2019年7月19日')の値( '名前')
      印刷(OBJ)#<クエリセット[{ '名前': ' liangge'}]>

      # 方式2:反向查询
      obj1 = models.AuthorDetail.objects.filter(birthday='2019-07-19').values('author__name')
      print(obj1)  # <QuerySet [{'author__name': 'liangge'}]>
  • 多くの
    • 本の出版の家作る方法についてのロード13件のお問い合わせは
      #1の方法:フォワード問い合わせ
      OBJ = models.Book.objects.filter(タイトル=「作る方法13をロードする」).values( ' publish__name ')
      プリント(OBJ)#<クエリセットその[{' publish__name ':'拡張押し}]>

      # 方式2:反向查询
      obj1 = models.Publish.objects.filter(book__title='装13是如何炼成的').values('name')
      print(obj1)  # <QuerySet [{'name': '膨胀出版社'}]>
    • どのような展開を押すブック
      #実施例1:フォワード・クエリ
      OBJ = models.Book.objects.filter(publish__name = '拡張プレス').values(」タイトル')
      を印刷(OBJ)
      #<クエリセット[{'タイトルこと「:」どのようにすることを意味13「}、{」タイトル「: 」 バック村の誘惑に「}、{」タイトル「: 」 どのようにしてくださいするには13 2を意味「}、{」タイトル「 :」 傑弟のルアー「}]>

      # 方式2:反向查询
      obj1 = models.Publish.objects.filter(name='膨胀出版社').values('book__title')
      print(obj1)
      # <QuerySet [{'book__title': '装13是如何炼成的'}, {'book__title': '回村的诱惑'}, {'book__title': '装13是如何炼成的2'}, {'book__title': '杰哥诱惑'}]>
  • 多くの多くの
    • この本は書い誘惑Jiegeある
      フォワード問い合わせ:#1道
      OBJ = models.Book.objects.filter(タイトル= 'Jiege誘惑').values( 'authors__name')
      [印刷(OBJ)#<クエリセットを{ 'authors__name': 'yuhao' }]>

      # 方式2:反向查询
      obj1 = models.Author.objects.filter(book__title='杰哥诱惑').values('name')
      print(obj1)  # <QuerySet [{'name': 'yuhao'}]>
    • yuhao本を書かれている
      #1の方法:フォワード問い合わせ
      。OBJ = models.Book.objects.filter(authors__name = 'yuhao')の値( 'タイトル')
      を印刷(OBJ)
      #<クエリセット[{ 'タイトル': ' ': '}、{'タイトル手段13作る方法 ' yuhao紀要'}、{'タイトルを': ' '作る方法13 2 '}、{'タイトル意味 :' Jiegeルアーを「} ]>

      # 方式2:反向查询
      obj1 = models.Author.objects.filter(name='yuhao').values('book__title')
      print(obj1)
      # <QuerySet [{'book__title': '装13是如何炼成的'}, {'book__title': 'yuhao的回忆录'}, {'book__title': '装13是如何炼成的2'}, {'book__title': '杰哥诱惑'}]>
  • 高度
    • ロードされた13冊の著者名で出版された書籍との名前
      の3つのテーブルに関連付けられている#、書籍、著者、出版します

      方式一:
          obj = models.Publish.objects.filter(name='装13出版社').values('book__title','book__authors__name')
          print(obj)
          # <QuerySet [{'book__title': '回娘家的诱惑', 'book__authors__name': 'jiege'}, {'book__title': '回娘家的诱惑', 'book__authors__name': 'yuhao'}]>
      
      方式二:
          obj1 = models.Book.objects.filter(publish__name='装13出版社').values('title','authors__name')
          print(obj1)
          # <QuerySet [{'title': '回娘家的诱惑', 'authors__name': 'jiege'}, {'title': '回娘家的诱惑', 'authors__name': 'yuhao'}]>
      
      方式三:
          obj2 = models.Author.objects.filter(book__publish__name='装13出版社').values('book__title','name')
          print(obj2)
          # <QuerySet [{'book__title': '回娘家的诱惑', 'name': 'jiege'}, {'book__title': '回娘家的诱惑', 'name': 'yuhao'}]>

      ネイティブSQL文は、このようなある:
      SELECT
      app01_book.title、
      app01_author.name
      FROM
      app01_publish
      INNERは=がapp01_book.publish_id app01_book ON JOINのapp01_publish.nid
      INNERがONに= app01_book_authors.book_id登録しよapp01_book_authors app01_book.nid
      INNERをapp01_author ON app01_author.nid = app01_book_authors、JOINを。 AUTHOR_ID
      WHERE
      app01_publish.name =「プレスは13意味」を、
      Navicatはツールに:

    • すべての書籍の4名の先頭に公表された電話番号と出版社の名前の
      4つのテーブルに関連付けられている#、ブックは、著者、AuthorDetailを公開します

      # 方式一
          obj = models.AuthorDetail.objects.filter(telephone__startswith='4').values('author__book__title','author__book__publish__name')
          print(obj)
      
      # 方式二
          obj1 = models.Book.objects.filter(authors__authorDetail__telephone__startswith='4').values('title','publish__name')
          print(obj1)
      
      # 方式三    
          obj2 = models.Publish.objects.filter(book__authors__authorDetail__telephone__startswith='4').values('book__title','name')
          print(obj2)
      
      # 方式四
          obj3 = models.Author.objects.filter(authorDetail__telephone__startswith='4').values('book__title','book__publish__name')
          print(obj3)

3.related_name

あなたがrelated_nameを定義した場合、逆引き、related_nameは、テーブル名に置き換えた場合、

注意:パラメータを使用してのみ、逆引きに影響を与えるで外部キーを作成FOREIGNKEY

例えば:

# 在创建Book表的时候

class Book(models.Model):
    ......
    publish=models.ForeignKey(to="Publish", to_field = "nid", on_delete = models.CASCADE,related_name='xx')
    ......
    
# 因为定义了related_name='xx',所以
    # 在正向查询时,不会影响什么
    # 在反向查询时,就不会用小写的表名了,而是必须用'xx',否则会报错
    
比如查询 装13是如何炼成的 这本书的出版社的名字
正向查询:
    obj = models.Book.objects.filter(title='装13是如何炼成的').values('publish__name')
    print(obj)
反向查询:
    # 没加related_name='xx'
    obj1 = models.Publish.objects.filter(book__title='装13是如何炼成的').values('name')
    print(obj1)
    # 加入了related_name='xx'
    obj1 = models.Publish.objects.filter(xx__title='装13是如何炼成的').values('name')
    print(obj1)

第二に、集計クエリ

  1. 集合

すべての書籍の平均価格、最高価格

from django.db.models import Avg,Max,Min,Count
obj = models.Book.objects.all().aggregate(a=Avg('price'),m=Max('price'))
print(obj)  # {'a': 411.998571, 'm': Decimal('998.00')}

注意点:

  • 骨材は、()の辞書を取得するクエリセット終了句であります
  • キー値によって辞書は、直接計算するために使用することができた数である
    印刷(OBJ [「M」] - 2)#{「price__avg」:2.833333}

おすすめ

転載: www.cnblogs.com/yangzm/p/11241117.html