Djangoグループ統合クエリの例を共有する


複数テーブルクエリ
1.添削
ペアの多さ:最初の1つ以上、外部キーはオブジェクトまたは依存テーブルのメインキー(publish and book)とすることができます。

publish = Publish.objects.create()
Book.objects.create(....publish=publish|publish_id=publish.id)
削除:標準のカスケード削除があります。
bookは外鍵を修正します。外鍵は必ず存在します。
マルチペア:
関係表の取得(book(メインキー)and author)book.author
増長:book.author.add(作者の対象者たち)
削除:clear()削除remove()は一人の作者を削除することができます。
set([作者のオブジェクトたち]キーたち)
2.チェック
対象に基づいて、属性を探しています。逆に類名小文字を探して、複数のレコード類名小文字を書きます。セット

book.publish.first().name (book      ,  queryset)
publish.book_set.first().name
二重下線に基づく:

Book.objects.filter(id=1).values('publish__name')[0] (values      queryset)
publish.values('book__name')
今日の内容
1.グループクエリ:集約結果group_by()
2.集計関数
3.フィールド
グループクエリ(個別集約クエリandグループ統合クエリ---mysqlに基づく)
Book:id name price publish_date publish
集計関数は単独で使用できます。つまり、シート全体は大きなグループです。
select max(price)from book
集計関数はグループ内で使用されます。

select max(price) as high_price from book group by publish having high_price > 50; 
集約クエリ---ORMに基づく
集計関数の使用シーン:
単独で使用します。グループ化せずに、集計結果のみを確認します。
グループ使用:フィールドでグループ化し、グループフィールドと集約結果を確認することができます。
集計関数をインポート:
from django.db.models import Avg,Max,Min,Count,Sum
個別集約クエリ:aggregate(集合、集合)---グループ化しない
同前の文法
󑧙重合関数:Max,Min,Sum,Avg,Count
aggregate(エイリアス=集計関数('フィールド')
ルール:
1.複数のフィールドを同時に集約処理することができます。aggregate(name 1=、name 2=...)
2.QuerySet対象の方法(all,filter)です。
3.戻り値はdictタイプです。
4.aggregateの前のvalues操作は機能しません。無視されます。
すべての本の中で一番高い本の値段

dic = Book.objects.all().aggregate(high_price=max('price),low_price=min('price'))
グループ集約クエリ:annotate(コメント、コメント)---グループ分け
同前の文法
values('グルーピングフィールド').annotate(エイリアス=重合関数(‘フィールド').filter(アグリゲーションエイリアス条件).values('グルーピングフィールド','アグリゲーションフィールドのエイリアス')
ルール:
1.values---annotateグループ、valuesコントロールグループのフィールド、annotate制御アグリゲーションフィールド
2.valuesは複数のフィールドでvalues('フィールド1'、'フィールド2')をグループ化することができます。
3.複数のフィールドを同時に集約処理することができます。annotate(別名1=max('price')、別名2=min('price')
4.グループ化後のfilterはhavingを代表して判断し、集約フィールドのみを条件判断する(パラメータが非集約またはパケットであることを条件判断する代表where判断)
5.フィールドの値をとるvalues()は、デフォルトではすべてのパケットフィールドとアグリゲーションフィールドを取ることを省略し、自分で定義することもできます。
󑧙例:各出版社の出版する一番高い本の価格は50元の出版社の名前と最高価格より高いです。
󑧙思想:出版社のグループ(bookから出発する)によって、盛り上がっています。price=max('price')filter(ハイテンションprice_gt=50)
铅グループごとの価格が一番高いです。

Book.objects.all().values('publish__name').annotate(high_price=max('price').filter(high_price__gl=50).values('publish__name','high_price'))
フィールドのプロパティ
1.null:デフォルトのFasle(デフォルトのフィールドは空にできません)、Trueはフィールドがnullであることができます。
2.blank:デフォルトFalse、Trueはフィールドが空であることができます。
3.choice:このオプションフィールド値を制限したのは、指定されたchoiceのうちの一つでなければならない(元セットの元グループ)
sex=models.SmallInteger Field(chice=((1、'man'),(2,'female')
obj.get_sex_display()
checesというフィールドがあります。'女'または'男'を取得するには、get_フィールド名sex_display()--超過失効
4.db_column:カスタムフィールド名
db_column='gender'から別名このsex
5.db_index:True設定インデックス
6.default:フィールドのデフォルト値
7.editable:デフォルトはTrue、False:adminインターフェースに表示しない
8.prmary_key:TRUEはメインキーで、
9.unique:trueフィールドの値は重複してはいけません。
フィールド
1.AutoField():デフォルトの自己増加キーkey=True)
2.Boolean Field():ブールフィールドは、database tinintタイプに対応しています。
3.Char Field():文字タイプ(デフォルトは空ではない)
max_length=20、null=Trueは空です。
4.DateField():年月日
autonow=Trueデータは更新しないと更新できます。
autonow_add=Trueデータが初めて生成された場合
5.DateTimeField():年月日時分秒
autonow=Trueデータは更新しないと更新できます。
autonow_add=Trueデータが初めて生成された場合
6.Decimal Field():混合精度の小数型
max_digits=5、小数点以下の最大桁数を含む
decimal_places=2,小数点以下の桁数
7.Integer Field():整体型
非常用フィールド
リレーションフィールド
1.ForeignKey():外部キーフィールド
ト=関連モデル類(ペアが多い)
to_file=関連フィールドは、デフォルトの関連プライマリキーを省略します。
うむdelete(外キー関連データが削除された場合の操作)
models.CADEカスケード削除
modles.PROTECT投げ異常
models.SET_NULL設定空の値
modles.SET_DEFAULT設定のデフォルト値
models.SET(value)カスタム値
related_nameユーザー定義の逆方向クエリのフィールド名
db_constrant=Falseは、関連をキャンセルしますが、チェーンで調べられます。
まとめ:models.ForeignKey(to=related class name)、null=True、on_delete=models.SET_NULL,db_constrant=False、related_name='本類名小書')
2.OneToOneField():一対一フィールド
同じ外キー
3,ManyToManyField():多対多関係
ト=関連モデル類
through=関連関係クラス
through.fields関連関係表(自分フィールド、関連フィールド)
外部キー関連のForeignKeyを切断して使用します。
璣一対マルチクエリ--(publish and book)
𔽣様式一:外鍵を使わず、bookにpublish_を追加する。id属性
萼はDjango ORMチェーンで文法を調べていません。
璢class Book(models.Model):
ヽoo。ツ=models.charField(max_。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。length=20)
ヽoo。ツid=models.Integer Field(null=True)
同前
璢class Publish(models.Model):
ヽoo。ツ=models.charField(max_。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。length=20)
同前
シシシシ菷調査方式:
璣璝は第一冊のブックで出版社を探しています。
璣菵菵id=Book.object.first()publish_id。
萼萼publish=Publish.object.filter(id=id)[0].name
奄璖print(publish)
方式二:外鍵を使って、db_を使います。constrain=Falseフィールドセグメント接続
ハはD jango ORMで文法を調べられます。
class Book(models.Model):
name=models.hard Field(max_length=20)
publish=models.ForeignKey(to='Publish',db_constrant=False、null=True、on_delete=models.SET_NULL)菗Üto_field='id'は書かないと自動的に追加されます。
class Publish(models.Model):
name=models.hard Field(max_length=20)
󑧙書の出版社(外鍵方式)
ヽoo.objects.first(.)publish.name)
ヽoo.objects.filter(pk=1).values('pblish_uname
関連を切り離します。複数のペアが自動的に関係表を作成します。
葃断関系(db_constrant属性)の多対多自動作成関係表(book(外接キー)とauthor)
璜断後もDjango ORMlianiaoの検索文法をサポートします。
新しいテーブルに追加フィールドを追加する必要がない場合、自動的に作成できます。
class MyBook(models.Model):
name=models.hard Field(max_length=20)
すみません、ここで第三の表が生まれます。
bookauthor=models.ManyToManyField(to=MyAuthor)、db_constrant=False)
class MyAuthor(models.Model):
name=models.hard Field(max_length=20)
萼菵の検索方法
(自動的に3枚目の表を作る):本の作者
皬b 1=MyBook.object.first()
璣璝b 1.book_authorこれは関係表です。
璣for author in b 1.book_author.all():
(author.name)
璜print(MyBook.objects.filter(pk=1).values('book_author_u uname
関連を断つ---複数組の手動で関係表を作成する
ハ手動で関係表を作成する理由:自身のフィールドを持つことができ、関係表の類名で直接に第三の表を取得することができます。
ハ手動で関係表を作成すると、関係表は自身のフィールドをより多く持つことができます。
''
湖南省にある地名
󑧙1は自動的に関係表を作るのと似ていますが、依然としてDjango ORM連表検索文法をサポートしています。
class Book(models.Model):
name=models.hard Field(max_length=20)
class Author(models.Model):
name=models.hard Field(max_length=20)
クラスBook_Author(models.Model):
book=models.ForeignKey(to=Book)、null=True、on_delete=models.SET_NULL,db_constrant=False)
author=models.Foreign Key(to=Author)、null=True、on_delete=models.SET_NULL,db_constrant=False)
time=models.DateField()
''
''
湖南省にある地名
2、手動で関係表を作成し、関係表でForeignKey方式で外部キー関係表に基づくORM連表クエリをサポートし、同時にManyToManyFieldフィールドを明確にするので、ORM順方向連表検索にも対応します。
--db_constrant=False切断関連はForeignKeyまたはManyToManyFieldのいずれかの当事者で行うことができます。
class Book(models.Model):
name=models.hard Field(max_length=20)
奄明了throughとthrough_fields、ManyToManyFieldは自動的に関係表を作ることができません。関係がないとdbを使うことができません。constrantフィールドのプロパティ
author=models.ManyToManyField(to=Author)、through='Book_Author,through_fields=('book_id','author_id
class Author(models.Model):
name=models.hard Field(max_length=20)
クラスBook_Author(models.Model):
book=models.ForeignKey(to=Book)、null=True、on_delete=models.SET_NULL,db_constrant=False)
author=models.Foreign Key(to=Author)、null=True、on_delete=models.SET_NULL,db_constrant=False)
time=models.DateField()
''
まとめ:手動で3枚目の表を作成し、3枚目の表の添削は関係表の類名から派生したcreate_delete_udateを採用し、add_clear_remove setを持たない(関係表が自分のフィールドを持っているので、これらの方法は直接にこれらのフィールドを操作できない)
この記事では、Djangoグループの統合クエリの例についての共有記事を紹介します。Djangoグループの統合クエリの内容については、以前の記事を検索したり、以下の関連記事を見たりしてください。これからもよろしくお願いします。