brunch

매거진 Django doc

You can make anything
by writing

C.S.Lewis

by 장영석 Aug 01. 2018

Django Model - OneToOneField

relationship fields

OneToOneField


일대일 관계다. 개념적으로는, unique=True를 사용한 ForeignKey와 비슷하지만, 관계에서 "역참조" 측면에서는 단일 객체를 직접 리턴하는 점이 다르다.


어떤 방법을 통해 다른 모델을 "확장"하는 모델의 기본키로써 가장 유용하다. 다중 테이블 상속은 자식 모델로부터 부모 모델로의 암묵적인 일대일 관계의 추가로 구현된다.


위치 인수 하나가 필요하다. 관련될 수 있는 모델의 클래스. 이 동작은 재귀와 지연된 관계에 관한 모든 옵션을 포함해서 ForeignKey와 정확히 같다.


OneToOneField에 related_name 인수를 지정하지 않는다면, Django는 기본값으로 해당 모델의 소문자 이름을 사용할 것이다.


다음 예제를 참고해라.

User 모델은 다음과 같은 속성을 가지게 된다.

DoesNotExist 예외는 역참조 관계 접근 중에 진입할 관계 테이블이 없는 경우 발생된다. 예를 들면, user에게 MySpecialUser에서 지정된 supervisor가 없는 경우.

추가적으로, OneToOneField는 ForeignKey가 수용한 모든 추가 인수를 수용한다. 추가로 하나의 추가 인수도 수용한다.


OneToOneField.parent_link

parent_link 설정이 True이고 다른 모델을 상속받은 모델에서 사용될 때, 이 필드는 서브 클래싱에 의해 일반적으로 암묵적으로 생성되는 추가적인 OneToOneField가 아닌 부모 클래스로 돌아갈 링크로 사용되야함을 가리킨다. 


아래 OneToOneField 예제가 있다.


OneToOne relationships


일대일 관계를 정의하기 위해 OneToOneField를 사용한다.


이 예제에서, Place는 선택적으로 Restaurant가 될 수 있다.

다음 예제는 Python API 기능을 사용하여 수행할 수 있는 동작이다.


두 개의 Place를 생성한다.

Restaurant를 생성한다. 이 객체의 ID로서 "parent" 객체의 ID를 전달한다.

Restaurant는 place에 접근할 수 있다.

Place는 가능한 경우 restaurant에 접근할 수 있다.

p2 관련된 restaurant을 가지고 있지 않다.

또한 예외를 잡기 위한 코드 없이 hasattr을 사용할 수 있다.

할당 표기법을 사용해서 place를 설정한다. place가 Restaurant의 기본키이기 때문에, save는 새로운 restaurant를 생성할 것이다.

역방향의 할당을 사용해서 place를 다시 설정해라.

일대일 관계에 지정되려면 객체를 반드시 저장해야 한다는 점에 주의해라. 저장되지 않는 Place를 사용해 Restaurant를 만들면 ValueError가 발생된다.

Restaurant.objects.all()은 Place가 아닌 Restaurant의 리스트만 반환한다. 두 개의 Restaurant가 있음에 주의해라. - Ace Hardware the Restaurant는 r.place = p2 호출에 의해 생성되었다.

Place.objects.all()은 Restaurant를 가지고 있는 것에 관계없이 모든 Place를 반환한다.

관계에 대한 조회를 사용하여 모델을 쿼리 할 수 있다.

물론 역으로 동작한다.

Restaurant에 Waiter를 추가해라.

Waiter를 쿼리 해라.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari