본문 바로가기
Python/Python FAQ

Python Django에서의 OneToOneField() vs ForeignKey(), OneToOneField() vs ForeignKey() in Django

by 베타코드 2023. 10. 5.
반응형

질문


Django OneToOneFieldForeignKey의 차이점은 무엇인가요?


답변


OneToOneField(SomeModel)ForeignKey(SomeModel, unique=True)의 차이점은 The Definitive Guide to Django에서 다음과 같이 설명되어 있습니다:

OneToOneField

일대일 관계입니다. 개념적으로는 unique=True가 있는 ForeignKey와 유사하지만, 관계의 "역"면은 직접 단일 객체를 반환합니다.

OneToOneField의 "역" 관계와는 달리, ForeignKey의 "역" 관계는 QuerySet을 반환합니다.

예시

예를 들어, 다음 두 모델이 있다고 가정해봅시다 (전체 모델 코드는 아래에 있습니다):

  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
반응형

댓글