django

model 관계(데이터베이스)

발전생 2020. 12. 18. 15:04

django model에서는 다른 model과의 관계를 규정하기 위한 몇 가지 방법이 존재한다.

  1. ManyToOneRelationship -> ForeignKey

  2. ManyToManyRelationship -> ManyToManyField

  3. 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)