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

Barbara Streisand
リリース: 2024-11-07 03:23:02
オリジナル
119 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!