ホームページ > バックエンド開発 > Python チュートリアル > Django ドキュメント - モデル内

Django ドキュメント - モデル内

黄舟
リリース: 2016-12-17 16:05:48
オリジナル
1032 人が閲覧しました

関係フィールド

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):

return u"%s the waiter at %s" % (self.name, self.restaurant)



逆関連付けを使用すると、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
< Dogs the restaurant>
>>> Place.objects.get(restaurant__place__name__startswith="Demon")

>>> 上記はDjango ドキュメントの内容 - モデル。その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) に注目してください。



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート