2016-11-13 4 views
4

、あなたがモデルを作成し、必要に応じてあなたは、そのそれぞれの所有者のために、各Dogを照会したり、ManDjangoの後方関係はオーバーヘッドを追加しますか?ジャンゴで

owner = some_dog.owner 

all_dogs = some_man.dog_set.all() 

た場合のためにすべての犬を取得することができ、フィールド上

class Man: 
     ... 

class Dog: 
     ... 
     owner = models.ForeignKey(Man, on_delete=models.SET_NULL) 

を外部キーを指定することができますthe docsで指定された後方関係を作成したくない場合は、

class Man: 
     ... 

class Dog: 
     ... 
     owner = models.ForeignKey(Man, on_delete=models.SET_NULL, related_name='+') 

all_dogs = some_man.dog_set.all()にアクセスできなくなりました。

ただし、後方関係の追加の「構築」はオーバーヘッドを追加しますか?
all_dogs = some_man.dog_set.all()を一度も使用したことがない場合は
related_name='+'を指定しましたか?潜在的に物事を遅くするだろうか?

この機能は純粋にアプリケーション側のDjangoで実装されていますか、related_name='+'もデータベーススキーマ自体を変更しますか?

答えて

4

ただし、後方関係のこの追加の「構築」はオーバーヘッドを追加しますか?

私は決してall_dogs = some_man.dog_set.all()を使用した場合、私が犬に= '+' related_nameを指定していたかどうかは問題でしょうか?潜在的に物事を遅くするだろうか?

いいえ、いいえ。

この機能は純粋にアプリケーション側のDjangoで実装されていますか、またはrelated_name = '+'もデータベーススキーマ自体を変更しますか?

これはPython descriptorsで実装されています。 ForeignKeyの場合、それはReverseManyToOneDescriptorです。 データベーススキーマに変更はなく、関連する名前の有無によって移行が生成されることはありません。

リレーションシップを無効にしていない場合は、実際にモデルクラスの属性としてディスクリプタオブジェクトが実際に表示されます。

>>> Dog.owner 
<django.db.models.fields.related_descriptors.ForwardManyToOneDescriptor at 0x105db25d0> 
>>> Man.dog_set 
<django.db.models.fields.related_descriptors.ReverseManyToOneDescriptor at 0x105db27d0> 

これは、DjangoのORMの魔法を動作させるオブジェクトです。

関連する問題