クエリ(フォーカス)
- 表にまたがるオブジェクトベースのクエリ - サブクエリに似て
前方および逆引き参照クエリ
関係は現在のクラスから、その内部テーブル書面で(フィールド)を属性(テーブル)データは、クエリを転送と呼ばれることクラス(テーブル)に関連付けられたデータを照会するために、およびその逆は、逆引きと呼ばれています
- 一つのクエリ
フォワード・クエリ
#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
- 参加似てさえテーブル - クロステーブルダブル下線の問い合わせに基づいて、
前方および逆引き参照クエリ
- マンツーマン
アドレス問い合わせ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)
第二に、集計クエリ
- 集合
すべての書籍の平均価格、最高価格
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}