DjangoOneToOneFieldとForeignKeyの違い



Difference Between Django Onetoonefield



Djangoの公式ドキュメントによると:

1対1の関係。概念的には、これはunique = TrueのForeignKeyに似ていますが、リレーションの「逆」側は単一のオブジェクトを直接返します。


OneToOneFieldは、基本的にForeignKeyとunique = Trueと同じ効果がありますが、OneToOneFieldの逆関連付けを使用すると、オブジェクトが直接返されます。

逆に、ForeignKeyを使用すると、逆アソシエーションの後にQuerySetが返されます。

例:

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) def __unicode__(self): return self.name

Pythonのmanage.pyシェルに入力します。



>>> from testapp.models import Car, Engine >>> c = Car.objects.get(name='Audi') >>> e = Engine.objects.get(name='Diesel') >>> e.car # If the reverse association attribute of OneToOneField is not written in resolve_name, it is the lowercase of the counterpart's class name >>> from testapp.models import Car2, Engine2 >>> c2 = Car2.objects.get(name='Mazda') >>> e2 = Engine2.objects.get(name='Wankel') >>> e2.car2_set.all() # If the reverse association attribute of OneToOneField is not written in resolve_name, it is the lowercase _set of the counterpart's class name []