ホームページ >バックエンド開発 >Python チュートリアル >Django で `OneToOneField()` と `ForeignKey(unique=True)` を選択するのはどのような場合ですか?

Django で `OneToOneField()` と `ForeignKey(unique=True)` を選択するのはどのような場合ですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-07 03:23:02293ブラウズ

When to Choose `OneToOneField()` vs `ForeignKey(unique=True)` in Django?

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
unique=True を持つ ForeignKey は、一方向の関係を維持します。 「逆」側のオブジェクトを取得すると、QuerySet が返されます。
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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。