>  기사  >  백엔드 개발  >  Django에서 `OneToOneField()`와 `ForeignKey(unique=True)`를 언제 선택해야 합니까?

Django에서 `OneToOneField()`와 `ForeignKey(unique=True)`를 언제 선택해야 합니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-07 03:23:02120검색

When to Choose `OneToOneField()` vs `ForeignKey(unique=True)` in Django?

Django의 OneToOneField()와 ForeignKey() 비교

Django는 모델 간의 관계를 설정하기 위한 두 가지 기본 메커니즘인 OneToOneField()와 ForeignKey(()를 제공합니다. ). 둘 다 일대일 연결을 허용하지만 동작과 결과가 다릅니다.

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가 OneToOneField()를 사용하는 두 가지 모델인 Car와 Engine을 생각해 보세요. 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() 중 하나를 선택하는 것은 특정 데이터 모델과 사용 사례에 따라 다릅니다. 단일 역방향 개체에 대한 직접 액세스가 필수적인 진정한 일대일 관계가 필요한 경우 OneToOneField()가 권장됩니다. 복잡한 쿼리나 "역방향" 측의 최종 다중 개체 관계가 필요한 상황에서는 고유=True인 ForeignKey()가 더 적합합니다.

위 내용은 Django에서 `OneToOneField()`와 `ForeignKey(unique=True)`를 언제 선택해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.