반응형
질문
Django OneToOneField
와 ForeignKey
의 차이점은 무엇인가요?
답변
OneToOneField(SomeModel)
과 ForeignKey(SomeModel, unique=True)
의 차이점은 The Definitive Guide to Django에서 다음과 같이 설명되어 있습니다:
OneToOneField
일대일 관계입니다. 개념적으로는
unique=True
가 있는ForeignKey
와 유사하지만, 관계의 "역"면은 직접 단일 객체를 반환합니다.
OneToOneField
의 "역" 관계와는 달리, ForeignKey
의 "역" 관계는 QuerySet
을 반환합니다.
예시
예를 들어, 다음 두 모델이 있다고 가정해봅시다 (전체 모델 코드는 아래에 있습니다):
Car
모델은OneToOneField(Engine)
을 사용합니다.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>
ForeignKey
와 unique=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
반응형
댓글