-
Django - OneToOneField, ForeignKey, ManyToManyField개발일지 2022. 6. 16. 01:42
Django ORM 중 다른 테이블과의 관계
Django ORM은 Django에서 정해준 대로 작성을 하면 알아서
SQL 과 같은 관계형 DataBase에 적용이 되는 매직과도 같은 기능이다.
해당 기능 들 중 테이블간의 관계를 정의 하기 위한 것이 바로 아래의 해당 메소드들이라고 한다.
OneToOneField
ForeignKey
ManyToManyField
ForeignKey - 외래키
우선 가장 많이 사용하는 ForeKeyField 부터 보면
예를들어 가게와 사장님 이라는 모델이 있을 때
하나의 가게에는 한명의 사장님이 존재할 수있지만 한 사장님은 여러개의 가게를 가질수 있다 라고 가정을 한다면
가게와 사장님의 관계는 일 대 다 의 관계이다. ( 사장님이 일, 가게는 다 )
이를 코드로 표현하자면
class Master(models.Model): name = models.CharField(max_length=1000) class Store(models.Model): master = models.ForeignKey(Master, on_delete=models.CASCADE) menu = models.ManyToManyField(Food, blank=True) # on_delete : 연결된 일이 삭제됬을때 해당 테이블을 어떻게 할 건지에 대한 Option
# models.Foreignkey(<테이블 이름>, on_delete=< Option >) # on_delete 옵션 # models.CASECADE : 연결된 Table까지 같이 삭제 # models.SET_NULL : 해당 Table의 필드 값을 Null 처리 # models.SET_DEFAULT : 해당 Table의 필드 값을 Default로 처리 # models.PROTECT : 해당 요소가 지워지 않도록 ProtectedError 발생 # models.RESTRICT : 해당 필드의 Table가 지워지려고 하면 RestrictedError 발생 # models.SET(Value) : 정해진 Value 로 지정 # models.DO_NOTHING : 아무것도 안함
여기서 주의할 점은 ForeignKey를 선언하는 쪽이 다의 관계를 갖는 다는 것이다.
OneToOneField - 일대일 관계
해당 관계는 일대일 관계를 나타내며 하나의 데이터가 하나의 Table과 매칭이 될 때 사용한다.
예를 들어 아까의 가게라는 Table이 있었을 때 각 가게마다의 사업자 번호는 한 가게마다 고유하다고 가정하면
마치 하나의 필드명 마냥 한 Table가 연결이 된다.
해당 필드는 필드는 나누거나 구분할때 사용하면 좋을 것 같다.
코드로 표현하면 아래와 같다.
class BusinessNumber(models.Model): value = models.OneToOneField(TeamModel, on_delete=models.CASCADE) class Store(models.Model): master = models.ForeignKey(Master, on_delete=models.CASCADE) menu = models.ManyToManyField(Food, blank=True) # OneToONe 필드 사용 businessNumber = models.OneToOneField(BusinessNumber, on_delete=models.CASCADE)
코드
<필드명> = models.OneToOneField(<Table 이름>, on_delete=<Option>)
ForeignKey 와 똑같이 on_delete를 써줘야한다.
ManyToManyField - 다대다 관계
다대다 관계는 모델들이 서로 여러가지를 선택할 수 있을 때 설정한다.
예를 들면 가게는 여러개의 음식점을 갖고 있을 수 있고
반대로 음식들도 여러 가게에 존재할 수 있다.
따라서 서로 여러개에 있을 수 있으므로 다대다 관계이다.
따라서 ManyToManyField를 이용하여 Table를 구성해야한다.
class Food(models.Model): name = models.CharField(max_length=1000) class Store(models.Model): master = models.ForeignKey(Master, on_delete=models.CASCADE) businessNumber = models.OneToOneField(BusinessNumber, on_delete=models.CASCADE) menu = models.ManyToManyField(Food, blank=True)
<필드명> = models.ManyToManyField(<Table명>)
ManyToManyField는 on_delete 옵션을 걸수 없다.
또한 해당 필드를 비우고 싶다면 아래 옵션을 적어주면 된다.
blank = True
해당 관계들을 이용해서 여러 DB 의 관계를 더 쉽게 짤 수 있고 진정으로 SQL을 이용하는 방법인 것같다.
그리고 사용할 떄 마다 헷갈리는데 해당 필드를 선언한 쪽이 바라보는 것이고
해당 화살표를 반대로 참조를 하는 것이 역참조라고한다.
'개발일지' 카테고리의 다른 글
Django Channels 사용법 - 공식 문서 (0) 2022.06.21 DRF - VIEW 종류 (0) 2022.06.20 DRF - Serializer custom create (0) 2022.06.19