ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.