YUYANE

Django / ForeignKey 와 ManyToManyField 본문

Framework/DJANGO

Django / ForeignKey 와 ManyToManyField

YUYA 2021. 2. 23. 13:04

학습 강의

nomadcoders.co/airbnb-clone/lobby

 

Relation Fields 

 

장고 프로젝트는 여러 가지 앱으로 이루어진다. 앱 마다 데이터를 다루는 models.py 파일을 가지고 있는데, 하나의 models.py이 데이터를 카테고리에 따라 클래스로 분류한 다양한 데이터 모델 클래스들을 가질 수 있다.

 

 

 

에어비앤비 클론 코딩을 한다면, Rooms 라는 앱의 models.py 에 Room class, Facility class 등이 있는 경우를 예로 들 수 있다.

 

 

작업을 하다보면 Room 클래스의 필드(host)가 User 클래스의 필드(name)를 참조하는 것처럼 필드간의 상호작용이 생기는 경우가 있다. 이 때 활용할 수 있는 것이 ForeignKey와 ManyToManyField 이다. 위와 같이 서로 다른 모델에 있는 클래스를 참조할 수도 있고, 같은 모델 안에 있는 클래스 끼리의 상호작용도 가능하다.

 

ForeignKey와 ManyToManyField는 필드 간의 관계(Relationship fields)에 따라 분류된다.

 

 

ForeignKey

 

"class ForeignKey(to, on_delete, **options)"

 

- 다대일 관계(many-to-one relationship)

  예시 : 여러 개의 방(Many)을 예약한 사람(One), 여러 종의 차(Many)를 생산하는 공장(One)

- 동일한 앱 내에서 사용할 때 : 'to' 인자 자리에 클래스 명을 넣는다.

 

from django.db import models

class Car(models.Model):
    manufacturer = models.ForeignKey(
        'Manufacturer',
        on_delete=models.CASCADE,
    )
    # ...

class Manufacturer(models.Model):
    # ...
    pass

 

- 다른 앱의 모델을 사용할 때(lazy relationship) : 'to'인자 자리에 '앱 이름.클래스 명'을 넣는다.

 

from django.db import models

class Car(models.Model):
    manufacturer = models.ForeignKey(
        'producitons.Manufacturer',
        on_delete=models.CASCADE,
    )
    # ...

class Manufacturer(models.Model):
    # ...
    pass

 

- on_delete : ForeignKey에 의해서 참조되는 객체가 삭제될 때, 참조하고 있는 객체를 어떻게 처리할지에 대해 정의하는 부분이다. 위의 코드를 예로 들면, 'Manufacturer'이 삭제될 때, manufacturer은 어떻게 처리될 것인가 하는 문제이다.

 

 

ManyToManyField

 

class ManyToManyField(to,**options)

 

- 다대다 관계(many-to-many relationship)

  예시 : 여러 가지 가훈(many)은 여러 집(many)에서 사용될 수 있다. 

          [소설, 영화, 웹툰 등](many)과 [로맨스, 코믹, 판타지 등](many)

- 코드 예시

 

    room_type = models.ForeignKey(
        "RoomType", related_name="rooms", on_delete=models.SET_NULL, null=True)

 

 

 

참고

docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.ForeignKey

'Framework > DJANGO' 카테고리의 다른 글

Django / Meta Class & Abstract Base Class  (0) 2021.02.23
Django / ModelAdmin  (0) 2021.02.23
Django / Model Field  (0) 2021.02.23
Django / migrations을 하는 이유  (0) 2021.02.20
Django / models.py  (0) 2021.02.19
Comments