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 중국어 웹사이트의 기타 관련 기사를 참조하세요!