1. ホーム
  2. django

[解決済み] django の OneToOneField と ForeignKey の違いは何ですか?

2022-03-19 03:33:47

質問

Djangoとの違いは何ですか? OneToOneFieldForeignKey ?

解決方法は?

との違い OneToOneField(SomeModel)ForeignKey(SomeModel, unique=True) で述べたように Django の決定版 :

<ブロッククオート

OneToOneField

1対1の関係。概念的には、これは ForeignKeyunique=True しかし、リレーションの "reverse" 側は直接1つのオブジェクトを返します。

とは対照的に OneToOneField 逆方向の関係は ForeignKey "reverse"関係は、以下を返します。 QuerySet .

使用例

例えば、以下の2つのモデルがあるとします(以下、完全なモデルコード)。

  1. Car モデル使用 OneToOneField(Engine)
  2. Car2 モデル使用 ForeignKey(Engine2, unique=True)

内側から python manage.py shell を実行します。

OneToOneField

>>> from testapp.models import Car, Engine
>>> c = Car.objects.get(name='Audi')
>>> e = Engine.objects.get(name='Diesel')
>>> e.car
<Car: Audi>

ForeignKeyunique=True

>>> from testapp.models import Car2, Engine2
>>> c2 = Car2.objects.get(name='Mazda')
>>> e2 = Engine2.objects.get(name='Wankel')
>>> e2.car2_set.all()
[<Car2: Mazda>]

モデルコード

from django.db import models

class Engine(models.Model):
    name = models.CharField(max_length=25)

    def __unicode__(self):
        return self.name

class Car(models.Model):
    name = models.CharField(max_length=25)
    engine = models.OneToOneField(Engine)

    def __unicode__(self):
        return self.name

class Engine2(models.Model):
    name = models.CharField(max_length=25)

    def __unicode__(self):
        return self.name

class Car2(models.Model):
    name = models.CharField(max_length=25)
    engine = models.ForeignKey(Engine2, unique=True, on_delete=models.CASCADE)

    def __unicode__(self):
        return self.name