#入門:ORM(オブジェクトリレーショナルマッピング):オブジェクト - リレーショナルマッピング#
図1に示すように、モデルとデータベースとの対応関係:
----------クラステーブル
Fieldプロパティ変数-----
フィールド属性オブジェクト制約-----
クラスインスタンスオブジェクトテーブルレコード---
図2に示すように、単一のテーブルの基本的な操作:
DDLは言うことはありません。DML文の主記録ORMとの比較
増加:
SQL:INSERT表名(名前、年齢)VALUES( "ジョン"、23);
ORM:类名.objects.create(名= "ジョン"、年齢= 23)
クエリ:
SQL:SELECT * FROM表名どこ年齢= 23
ORM:类名.objects.filter(年齢= 23)
レビュー:
SQL:UPDATE表名SET年齢= 30名= "ジョン"
ORM:类名.objects.filter(名= "ジョン")更新(年齢= 30)。
削除:
SQL:DELETE表名名= "ジョン" FROM
ORM:类名.objects.filter(名= "ジョン")、削除()。
3、モデルベースの一般的なフィールドの種類:
CharFieldです:短い文字列の文字列フィールド
IntegerFieldと:整数
FloatField:フロート、二つのパラメータを参照する必要性を。max_digits:桁の最大合計数。decimal_places:小数点以下の桁数の最大値。
AutoField通常は使用しません。PRIMARY_KEY = Trueの場合は、カスタムの主キーでした。
テキストフィールド:大容量のテキストフィールド
EmailField:合法性の確認メールでCharFieldですがMAXLENGTHパラメータを受け付けません
DateField:日付フィールド
の残りの部分にいくつかのあまり一般的ではあります。CharFieldです大法が良いです。
4、ORM一般的なクエリ方法:
1、すべての():クエリのすべての結果
図2に示すように、フィルタ(** kwargsから):フィルタ条件に一致するすべてのオブジェクトのクエリ
図3は、(** kwargsから)を取得:スクリーニング、および1つの結果だけであれば、返される複数のかどうか、エラーをスクリーニングした結果
4、除外(** kwargsから):フィルタ条件が否定
5、ORDER_BY(*フィールド):ソート
6)(リバース:リバース
7、カウント:クエリの数をクエリセットオブジェクトを返すように
図8に示すように、最初の()戻り値:最初のレコード
9、最後の()戻り値:最後のレコード
10、)(存在する:クエリはクエリセットにデータが含まれている場合はtrue、そうでない場合はfalseを返します。
図11は、()別個:重量に結果を返します
12は、値(*フィールド):ValueQuerySetを返します。
5、ファジークエリに基づいて二重下線:
クラス名.objects.filter(price__in = [100200300])#価格フィールド値は選択肢の一つである場合
クラス名.objects.filter(price__gt = [100])#価格オプションフィールドの値がより大きくなります
クラス名.objects.filter(price__lt = [100])#価格オプションフィールドの値よりも小さいです
クラス名.objects.filter(price__range = [100200])#価格オプションフィールドの値が区間内にあります
クラス名.objects.filter(title__contains = [「ジョン」])#タイトルフィールドの値は、文字列、大文字と小文字の区別が含まれています
クラス名.objects.filter(title__icontains = [「ジョン」])#タイトルは、文字列フィールドの値は、大文字と小文字を区別しないで含まれてい
クラス名.objects.filter(title__startswith = [「PY」])#タイトルフィールドの値は、文字列の先頭にあります
図6に示すように、マルチテーブル運転(のForeignKeyとのManyToManyField)。
1、多くのForeignKeyの操作
1、レコードを追加します。
ORM:クラス名.objects.create(名=「ジョン」、年齢= 23、関連テーブルのフィールド= XX)#単一のテーブルには、もう一つのフィールドであり、
2、多くのManyToManyField
B-多くのテーブルとそのテーブルを想定し、第3のテーブル作成C
1、レコードを追加します。
結果= a.objects.get(ID = 1)
result.b.add(2)
表C関連レコードを追加します。テーブルID = 1、BテーブルID = 2
2、削除の記録:
モード1:
結果= a.objects.get(ID = 1)
result.b.remove(2,3)
表C 2つの関連レコードを削除します。テーブルID = 1、B又はB表ID = 2テーブルID = 3
オプション2:
結果= a.objects.get(ID = 1)
result.b.clear()
a.id = 1のCテーブルのすべてのレコードはすべて削除するには
モード3:
結果= a.objects.get(ID = 1)
result.b.set(4)
削除表Cすべてのa.id = 1を記録。次に、レコードを挿入a.id = 1、b.id = 4
3、仲介モデル:
表Bと表。Cは、のManyToManyFieldは、タイムテーブルでテーブルを生成設けられ、2つだけのテーブル表デフォルトのC
フィールド関連しており、変更することはできません。しかし、のManyToManyFieldを結合する時=「XXX」を通じて追加
後、あなたは自動的に作成されませんジャンゴ、編集に無料で、第3の関連テーブルXXXをカスタマイズすることができます。
4、クロステーブルのクエリ。
?そこにA、B、C、3つのテーブルを想定。多くのBと、テーブルが設けられているのForeignKey、テーブル、およびc-多くのテーブルを。
テーブルに配置されたのManyToManyField
####オブジェクト(サブクエリ)に基づきます
フォワードは設定されていない場合は、relate_nameにより、ルックアップ逆、フィールドで照会します。小文字_setのテーブル名によると、
チェックB - N調査:
結果= A.object.get(ID = 1)
result.b.all()#bをので、すべてを追加するために、複数のパーティがあるため。チェックは1のいずれかである場合、追加されません。
:逆引き - Bチェック
結果= B.object.get(ID = 1)
result.a_set
ManyToManyFieldとOneToOneField共感。
#### 2つのアンダースコアに基づいて(クエリに参加)
フィールドによって前方クエリは、小文字で逆ルックアップテーブル名を押してください
テーブルのidフィールド名フィールドは、表Bをチェックします
A.objects.filter(ID = 1).values( "b__name")正引き
b.object.filter(A_ID = 1).values( "名前")逆引き参照
*ここでのフィルターもあいまい検索クエリと組み合わせることができます。
5、クエリをグループ化します
集合
A.objects.all()。集計(AVG( "XXXX"))
パケット
シングルテーブルパケット:テーブルのフィールドのDEPを持っています。グループ化されたフィールドをDEP。平均化給与
SQL:DEPによって選択DEP、AVG(給与)フォームA群
ORM :.パケットフィールド#annotateの前にA.objects.values( "DEP")注釈(平均= AVG( "給与"))
これは、一般的に、すべての利用価値はありません。
クロスグループテーブル:
モード1:A.objects.value(ID).annotate(C =カウント(「B」))#パケットテーブルの主キーによれば、主キー戻るbの二つのフィールドとCのIDを数えます
方式2:A.objects.all.annotate(C =( "B" カウント))の値( "C"、 "XXX")
モード2は、より実用的な、戻り値のデータを指定することができます
要約:
複雑なORMの特定のスタイルは、次のように:ユーザテーブルと注文テーブル。ユーザーは、すべての某劉、個々の注文の最高価格を照会します。ユーザテーブルIDが順番テーブルcus_idに関連付けられたと仮定すると、ユーザ名と最上位の量を返し
SELECT a.username、 最大(b.prcie) FROM USER AS INNERは、JOIN ORDER ASのB a.id = b.cus_id とユーザ名LIKEを "刘%" GROUP BY cus_id
ORMは、次のように変換する必要があります。
User.object.filter(username__startswith = " 刘").annotate(MAX_PRICE =マックス(" order__price "))。値(" ユーザ名"、" MAX_PRICE ")
PS:1、db_constraintを提供するモデルクラスに関連する分野に= Falseの、制約はデータベースのORMないだけに影響を与えることができます
図2に示すように、頻繁に使用-many関連は多数のテーブルを生成します。これは、メンテナンスを助長されていません。良い構造のアイデアを進めます。