最初:ピュアは、自動的に第三のテーブルを作成します
ピュアオート
クラスブック(models.Model): タイトル = models.CharField(max_lengthを= 32 ) 価格 = models.DecimalField(max_digits = 8、decimal_places = 2 ) 著者(=へ= models.ManyToManyField ' 著者' ) クラスの著者(models.Model ): 名前 = models.CharField(max_lengthを= 32 ) 年齢 = models.IntegerField()
利点:あなたは二重下線を使用し、ドット構文正逆オブジェクトことができます
短所:フィールド3番目の表は、非常に貧しい死者拡大に限定されています
II。第二純粋マニュアル第3のテーブルを作成します
クラスブック(models.Model): タイトル = models.CharField(MAX_LENGTH = 32 ) 。価格 = models.DecimalField(。=のmax_digits 8、decimal_places = 2 ) クラス著者(models.Model): 名前 = models.CharField(MAX_LENGTH = 32 ) 年齢 = models.IntegerField() #3番目のテーブル純粋にマニュアル作成 クラスBook2Author(models.Modelを): ブック = models.ForeignKey(=に' ブック' ) 著者(=へ= models.ForeignKey ' 著者' ) #に基づきます1種類は、私たちの本と貧困層の著者を拡大表に自動的に固定のみ純粋に私たちの3番目のフィールドを拡大する方法はありません 情報= models.CharField(max_lengthを= 64)
テストテストコード
インポートのOS インポートSYS なら __name__ == " __main__ " : os.environ.setdefault(" DJANGO_SETTINGS_MODULE "、" test_22.settings " ) をインポートジャンゴ django.setup() から app01 インポートモデル #1 RES = models.Book.objects.filter( PK = 1).values( 'author__name') #1 プリント(RES)#基于双下划线反向表名也不行了 book_obj = models.Book.objects.filter(PK = 1 )1次回() プリント(book_obj.author__set .ALL()) #AttributeError:「NoneType」オブジェクトの属性がNO「author__setている #の小文字_setでオブジェクトベースの一方向のテーブル名を>>>結果は_setを追加する必要がありますビクトリア逆 #この方法は、彼らがああをチェックする方法を学んだんているかどうか確認することはできません動作しませんが
長所:第三のテーブルには、高い拡張するために他のフィールドを追加することができます
短所:いいえ、前方での方法とクエリ目標点の__二重のアンダースコアの構文を逆転
III。第三の半手動半自動
すべての利点:基本の将来の発展は、第三を使用することです
クラスブック(models.Model): タイトル = models.CharField(max_lengthを= 32 ) 価格 = models.DecimalField(max_digits = 8、decimal_places = 2 ) 著者 = models.ManyToManyField(=に' 著者' =通じ、' Book2Author '、 through_fields =(' ブック'、' 著者' )) クラスの著者(models.Model): 名前 = models.CharField(max_lengthを= 32 ) 年齢 = models.IntegerField() クラスBook2Author(models.Model): ブック = models.ForeignKey(=に「ブック」) buthor = models.ForeignKey(=に「著者」) #最初に基づいて自動的に私たちの本とポールの著者を拡張固定のみの純粋なテーブルで私たちの3番目のフィールドを拡大する方法はありません差分 情報= models.CharField(max_lengthを= 64)
画像の理解
注意点:
テスト
models.Book.objects.filter = RES(= PK 1).values(' authors__name ' ) プリント(RES) #<クエリセットその[{ 'authors__name': 'ココ'}]> #時々データベースは、メインデータカードの原因となります見つけ出すそうでない場合は、手動でデータを更新する必要があります
正逆検索
#フォワード検索 #book_obj = models.Book.objects.filter 1次回()(= PK 1) #プリント(book_obj.authors.all())#<クエリセット[<著者:Authorオブジェクト>すなわち> #フォワードによって結果はとマルチフィールド.ALL()である #は書籍名YYYの作者のための検索を逆に RES = models.Author.objects.filter(名前= ' YYY ').values(' book__title ' ) 印刷(RES) #<クエリセット[{ 'book__title': 'ピース'}]>