django model에서는 다른 model과의 관계를 규정하기 위한 몇 가지 방법이 존재한다.
-
ManyToOneRelationship -> ForeignKey
-
ManyToManyRelationship -> ManyToManyField
-
OneToOneRelationship -> OneToOneField
가령 한 번에 하나의 제품만 주문할 수 있는 시스템이 있다고 해보자.
Order는 Product, Customer와 관련이 있다.
위 3개 중 어떤 관계일까?
위 가정에 의해 Order는 하나의 Product와 매핑된다. 하지만 Product는 여러 개의 Order와 매핑될 수 있다.
저금통 Product가 있다고 해보자. 여러 주문에서 저금통을 구매할 수 있으니 하나의 Product에 여러 Order를 연결시킬 수 있다.
따라서 Order와 Product는 ManyToOne 관계이다.
이 때 django에서는 many에 해당하는 모델에서 one에 해당하는 모델을 클래스 변수로 넣어준다.
class Order(models.Model):
product = models.ForeignKey(Product, null=True, on_delete=models.SET_NUL)
이제는 ManyToMany 관계를 보자.
제품을 설명해주는 Tag가 존재한다고 해보자.
하나의 태그가 여러 제품의 설명에 적합할 수 있다. 또한 하나의 제품이 여러 태그를 가질 수 있다.
#따뜻 #휴대용 #기계 Tag들이 있다고 하면
#따뜻 Tag는 히터 Product와 핫팩 Product 두 개의 Product에 매핑 가능하다.
히터 Product는 #따뜻 #기계 두 개의 Tag에 매핑 가능하다.
따라서 Product와 Tag 관계는 ManyToMany 관계이다.
django에서는 둘 다 many 모델인데 그 중 보다 자연스로운 쪽에서 클래스 변수로 선언해줄 것을 권장한다.
Tag가 여러 Product를 가지는 것보다는 Product가 여러 Tag를 가지는 게 보다 자연스럽다.
class Product(models.Model):
tags = models.ManyToManyField(Tag)
'django' 카테고리의 다른 글
여러 개의 form을 만들어주는 formset (0) | 2020.12.19 |
---|---|
CRUD를 위한 ModelForm (0) | 2020.12.19 |
model을 만들면 해줘야 하는 일 (0) | 2020.12.17 |
django url pattern (0) | 2020.12.17 |
공통으로 사용하는 templates나 static은 프로젝트 폴더로 뺄 수 있다 (0) | 2020.12.17 |