関係フィールド
ForeignKey、ManyToManyField、OneToOneField はそれぞれ、モデル内の多対 1、多対多、および 1 対 1 の関係を定義します。
たとえば、本は出版社から出版され、出版社は多くの本を出版できます。本は複数の著者によって書かれており、一人の著者が何冊もの本を書くことができます。
クラス著者(models.Model):
名前=models.CharField(max_length=20)
クラス発行者(models.Model):
名前=models.CharField(max_length=20)
クラスBook(models.Model):
name=models.CharField(max_length=20)
pub=models.ForeignKey(Publisher)
authors=models.ManyToManyField(Author)
1. 未定義のモデルを関連付ける
未定義のモデルに関連付ける場合モデルの関連付けを確立するには、モデル オブジェクト自体の代わりにモデルの名前を使用します。
この例では、Book の後に Publisher と Author が定義されている場合、次の形式で記述する必要があります:
class Book(models.Model):
name=models.CharField(max_length=20)
pub=models .ForeignKey('Publisher ')
authors=models.ManyToManyField('Author')
2.Model はそれ自体に関連付けられます
Model はそれ自体と多対 1 の関係を持つことができます
class People(models.Model ):
name=models.CharField(max_length =20)
leader=models.ForeignKey('self',blank=True,null=True)
モデルはそれ自体と多対多の関係を持つこともできます
class Person(models.Model):
friends = models.ManyToManyField("self")
デフォルトでは、この関連付けは person1 が person2 の友達である場合、person2 も person1 の友達です
p1=。人()
p1.save()
p2=人()
p2.save()
p3=人()
p3.save()
p1.friends.add(p2,p3)
上記ではこの場合、p3 の友達を見つけたい場合は、p3.person_set.all() は必要なく、p3.friends.all() を直接使用します
この対称関係をキャンセルしたい場合は、symmetical を False に設定します
class Person2(models.Model):
friends=(models.ManyToManyField( "self",symmetrical=False)
p3 の友達をクエリするには、p3.person_set.all() が必要です
3. 名前を逆にする関連名
関連フィールドから関連フィールドを指すために使用される逆引きの名前。
抽象モデルを定義するときは注意してください。 、逆の名前を明示的に指定する必要があります。これを実行した後でのみ、いくつかの特別な構文が正しく機能します。
class Book(models.Model):
name=models.CharField(max_length=20)
pub=models.ForeignKey(Publisher,popular_name='pub')
authors=models.ManyToManyField(Author,popular_name='author' )
このようにして、Publisher または Author を使用して Book を逆クエリするときに、relative_name を使用できます (publisher1.pub.all() または author1.author.all())。
逆の関係を設定したくない場合は、relation_name を「+」に設定するか、「+」で終わるように設定します。
user = models.ForeignKey(User, relationship_name='+')
同じ Model を指す ManyToManyField が複数ある場合、FOO_set を逆にクエリするときに、それがどのManyToManyField フィールドであるかを把握することは不可能になります。リバースは無効にすることができます。 関係:
users = models.ManyToManyField(User, relationship_name='u+')
referents = models.ManyToManyField(User, relationship_name='ref+')
4. データベースの表現
Many-to- 1 つ: Django は、ForeignKey フィールド名 + "_id" をデータベース内の列名として使用します。上の例では、BOOK データテーブルにはモデルに対応するpublisher_id列があります。
db_column を明示的に指定することで、このフィールドの列名を変更できます。ただし、SQL をカスタマイズする場合を除き、データベースの列名を変更する必要はありません。
多対多: Django ManyToManyField 関係を表す中間テーブルを作成します。デフォルトでは、中間テーブルの名前は 2 つのリレーショナル テーブル名で構成されます。
一部のデータベースにはテーブル名の長さに制限があるため、中間テーブルの名前は自動的に 64 文字に制限され、一意のハッシュ文字列が含まれます。これ
は、book_authors_9cdf4 のようなテーブル名が表示される可能性があることを意味します。 db_table オプションを使用して中間テーブル名を手動で指定できます。
ただし、中間テーブルを手動で指定する場合は、through オプションを使用してモデルを指定し、別のモデルを使用して多対多のリレーションシップを管理できます。そしてこのモデル 中間テーブルに対応するモデルです:
class Person(models.Model):
name = models.CharField(max_length=128)
def __unicode__(self):
return self.name
class Group(models) .Model ):
name = models.CharField(max_length=128)
members = models.ManyToManyField(person, through='Membership')
def __unicode__(self):
return self.name
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(person, through='Membership')
def __unicode__(self):
return self.name
class Membership (models.Model):
person = models.ForeignKey(person)
group = models.ForeignKey(Group)
date_joined = models.DateField()
Invitation_reason = models.CharField(max_length=64)
このように、人がグループに参加したときに記録できます。
個人とグループ間の関係を確立するには、追加、作成、削除は使用できませんが、メンバーシップを使用する必要があります。
>>> リンゴ = person.objects.create(name="リンゴ スター")
>>> ポール = person.objects.create(name="ポール マッカートニー")
>> > ビートルズ = Group.objects.create(name="ビートルズ")
>>> メンバーシップ(人物=リンゴ、グループ=ビートルズ、
... date_joined=date(1962, 8, 16) ,
... Invitation_reason= "新しいドラマーが必要でした。")
>>> m1.save()
clear() は引き続き使用できます
>>> ()
多対多の関係がそれ自体に関連付けられている場合、中間テーブルのForeignKeyは同じModelを指すことができますが、それらは対称ではなくManyToManyFieldの両側として見なされ、対称である必要があります=Falseを設定する必要があります。
5. その他のパラメータ (引数)
5.1ForeignKey は、関係の動作方法を定義する次のオプションのパラメータを受け入れます。
ForeignKey.limit_choices_to
これは、フィルター条件と対応する値を含む辞書であり、Django 管理バックグラウンドで関連オブジェクトをフィルターするために使用されます。たとえば、Python の日時を使用すると、 モジュール、フィルター条件を満たさない関連オブジェクトをフィルターで除外します:
limit_choices_to = {'pub_date__lte': datetime.date.today}
pub_date が現在の日付より前の関連オブジェクトのみが選択できます。
Qも使用できます 辞書の代わりにオブジェクトを使用することで、より複雑なフィルタリングが可能になります。 limit_choices_to が Q オブジェクトの場合、外部キー フィールドが ModelAdmin の raw_id_fields に配置されている場合は使用できません。
ForeignKey.to_field
現在の関係が関連オブジェクトのどのフィールドに関連付けられているかを指定します。デフォルトでは、to_field は関連オブジェクトの主キーを指します。
ForeignKey.on_delete
モデルオブジェクトのForeignKeyに関連付けられたオブジェクトが削除されると、デフォルトではこのオブジェクトも一緒にカスケード削除されます。
user = models.ForeignKey(User,blank=True, null=True, on_delete=models.CASCADE)
CASCADE: デフォルト値。モデルオブジェクトは、ForeignKey に関連付けられたオブジェクトとともに削除されます
SET_NULL:モデル オブジェクトのForeignKeyフィールドはnullに設定されます。もちろん、null を True に設定する必要があります。
SET_DEFAULT: モデルオブジェクトのForeignKeyフィールドをデフォルト値に設定します。
Protect:ForeignKey 関連オブジェクト
を削除すると、ForeignKey 関連オブジェクトが削除されないように ProtectedError が生成されます。
SET(): モデルオブジェクトのForeignKeyフィールドをSET()に渡された値に設定します。
def get_sentinel_user():
return User.objects.get_or_create(username='deleted')[0]
class MyModel(models.Model):
user = models.ForeignKey(User, on_delete=models.SET(get_sentinel_user) ))
DO_NOTHING: 何もしません。
5.2 ManyToManyField は、関係の動作方法を定義する次のオプションのパラメーターを受け入れます。
ManyToManyField.limit_choices_to
の使用法は、ForeignKey.limit_choices_to と同じです。
limit_choices_to は、through パラメータで指定されたメディエーション テーブルを使用する ManyToManyField では機能しません。
ManyToManyField.metrical
は、再帰的な多対多の関係を定義する場合にのみ機能します。
ManyToManyField.through
中間テーブルを手動で指定します
ManyToManyField.db_table
多対多の関係データを格納するデータベース内のテーブルの名前を指定します。このオプションが指定されていない場合、Django は 2 つのリレーショナル テーブルの名前に基づいて新しいテーブル名を中間テーブルの名前として生成します。
6.OneToOneField
class OneToOneField(othermodel[,parent_link=False, **options])
は、1 対 1 の関係を定義するために使用されます。大まかに言えば、unique=True を宣言するForeignKeyと同じです。 非常に似ていますが、逆の関連付けを使用すると、取得されるのはオブジェクトのリストではなく、単一のオブジェクトであるという点が異なります。
このフィールドは、モデルが別のモデルから拡張される場合に非常に役立ちます。たとえば、複数テーブルの継承 (Multi-tableinheritance) が子に渡されます。 これは、親モデルを指すモデルに 1 対 1 の関連付けを追加することで実現されます。
このフィールドにはパラメータ、つまり関連するモデルクラスを指定する必要があります。再帰的関連付けや遅延関連付けなど、ForeignKey と同じように機能します。 それは同じだ。
また、OneToOneField は、ForeignKey で受け入れ可能なパラメーターを受け入れます。OnetoOneField は 1 つのパラメーターのみです 独自: OneToOneField.parent_link
これが True で、親モデルから継承された子モデルに作用する場合 (これは継承を遅らせることはできません)、親モデルは 本当に存在する必要があります)、その場合、フィールドは親クラスを拡張して他の OneToOneFields のように親クラスのプロパティを継承するために使用されるのではなく、親クラスのインスタンスを指す参照 (またはリンク) になります。
django.dbからインポートモデル、トランザクション、IntegrityError
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
def __unicode__(self ):
return u"%s the place" % self.name
class Restaurant(models.Model):
place = models.OneToOneField(Place, Primary_key=True)
serves_hot_dogs = models.BooleanField()
serves_pizza = models .BooleanField()
def __unicode__(self):
return u"%s the restaurant" % self.place.name
class Waiter(models.Model):
restaurant = models.ForeignKey(Restaurant)
name = models .CharField(max_length=50)
def __unicode__(self):
逆関連付けを使用すると、Not a が返されます。オブジェクトのリストですが、単一のオブジェクト:
>>> p1 = Place(name='Demon Dogs', address='944 W. Fullerton')
>>> p1.save () >>> r = レストラン(place=p1、serve_hot_dogs=True、serve_pizza=False)
>>> p1.restaurant
>>> Place.objects.get(restaurant__place__name__startswith="Demon")
>>> 上記はDjango ドキュメントの内容 - モデル。その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) に注目してください。

Pythonは、Web開発、データサイエンス、機械学習、自動化、スクリプトの分野で広く使用されています。 1)Web開発では、DjangoおよびFlask Frameworksが開発プロセスを簡素化します。 2)データサイエンスと機械学習の分野では、Numpy、Pandas、Scikit-Learn、Tensorflowライブラリが強力なサポートを提供します。 3)自動化とスクリプトの観点から、Pythonは自動テストやシステム管理などのタスクに適しています。

2時間以内にPythonの基本を学ぶことができます。 1。変数とデータ型を学習します。2。ステートメントやループの場合などのマスター制御構造、3。関数の定義と使用を理解します。これらは、簡単なPythonプログラムの作成を開始するのに役立ちます。

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

Python 3.6のピクルスファイルのロードレポートエラー:modulenotFounderror:nomodulenamed ...

風光明媚なスポットコメント分析におけるJieba Wordセグメンテーションの問題を解決する方法は?風光明媚なスポットコメントと分析を行っているとき、私たちはしばしばJieba Wordセグメンテーションツールを使用してテキストを処理します...

正規表現を使用して、最初の閉じたタグと停止に一致する方法は? HTMLまたは他のマークアップ言語を扱う場合、しばしば正規表現が必要です...

Investing.comの反クラウリング戦略を理解する多くの人々は、Investing.com(https://cn.investing.com/news/latest-news)からのニュースデータをクロールしようとします。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

WebStorm Mac版
便利なJavaScript開発ツール

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

ホットトピック



