Django の OneToOneField() とForeignKey() の比較
Django は、モデル間の関係を確立するための 2 つの主要なメカニズム、OneToOneField() とForeignKey() を提供します。 )。どちらも 1 対 1 の関連付けを可能にしますが、その動作と結果は異なります。
OneToOneField() およびForeignKey(unique=True)
本質的には、 OneToOneField(SomeModel) は、ForeignKey(SomeModel, unique=True) と機能的に似ています。どちらの場合も、オブジェクト間に一意の関係を強制します。ただし、微妙な違いがあります。
OneToOneField は双方向の関係を提供し、「逆」側のオブジェクトを取得すると、対応する単一のオブジェクトを直接返します。
car = Car.objects.get(name='Audi') engine = car.engine # Returns the corresponding Engine object directly
car2 = Car2.objects.get(name='Mazda') engines = car2.engine2_set.all() # Returns a QuerySet containing the corresponding Engine2 object
例の図
Car と Engine の 2 つのモデルを考えます。Car は OneToOneField() を使用します。 Car2 は、ForeignKey(unique=True) を使用します。次のコードを実行すると、違いがわかります。# OneToOneField car = Car.objects.get(name='Audi') engine = Engine.objects.get(name='Diesel') print(engine.car) # Prints "Audi" # ForeignKey with unique=True car2 = Car2.objects.get(name='Mazda') engine2 = Engine2.objects.get(name='Wankel') print(engine2.car2_set.all()) # Prints "[<Car2: Mazda>]"
参照用のモデル コード
class Engine(models.Model): name = models.CharField(max_length=25) class Car(models.Model): name = models.CharField(max_length=25) engine = models.OneToOneField(Engine) class Engine2(models.Model): name = models.CharField(max_length=25) class Car2(models.Model): name = models.CharField(max_length=25) engine = models.ForeignKey(Engine2, unique=True)
正しい関係の選択
最終的に、OneToOneField() と ForeignKey() のどちらを選択するかは、特定のデータ モデルとユースケースによって異なります。単一の逆オブジェクトへの直接アクセスが必須である真の 1 対 1 の関係が必要な場合は、OneToOneField() をお勧めします。複雑なクエリまたは「逆」側での最終的な複数オブジェクトの関係が必要な状況では、unique=True を指定したForeignKey() の方が適切です。以上がDjango で `OneToOneField()` と `ForeignKey(unique=True)` を選択するのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。