4、ジャンゴ、ORM

#入門: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関連は多数のテーブルを生成します。これは、メンテナンスを助長されていません。良い構造のアイデアを進めます。                 

 

 

          

           

 

   

  

    

おすすめ

転載: www.cnblogs.com/cbslock/p/12148708.html