YUYANE

Django / Managers와 QuerySet (related_name) 본문

Framework/DJANGO

Django / Managers와 QuerySet (related_name)

YUYA 2021. 2. 24. 14:02

학습 강의

nomadcoders.co/airbnb-clone/lobby

 

 

지금까지 models.py를 통해 데이터 구조도 만들고, 데이터를 불러올 수도, 저장할 수도 있었다. 오늘은 조금 더 깊숙이 들어가 장고가 어떻게 데이터를 관리하고 있는 지 알아보자.

 

QuerySet

 

- 데이터베이스에 있는 객체들의 집합

- model의 Manager를 통해 QuerySet을 얻을 수 있다.

 

 

Django Managers

 

- 장고 models는 데이터베이스 쿼리 작업을 할 수 있는 인터페이스를 제공하는데, 이것은 Manager라고 한다.

- 장고 앱의 각각의 모델에는 적어도 하나의 Manager가 존재한다.

- 클래스명.objects를 통해서 Manager를 부를 수 있다. 

  ex) Person.objects

 

 

Manager & QuerySet

 

- Person.objects.all()는 통해 데이터베이스의 모든 Person 객체들을 반환한다.

- filter()를 통해 원하는 필드값을 가진 객체들만 추출할 수도 있다.

people = Person.objects.all()
Korean = people.filter(country="Korea")

 

 

Related Objects

 

model에 relationship(ForeignKey, OneToOneField, ManyToManyField)를 정의했다면, 그 모델의 객체는 연결된 객체에 접근하는 API를 가진다.

 

 

ForeignKey와 related_name

 

위와 같이 Review 모델에 있는 필드 user가 User 모델에 있는 필드 name 을 ForeignKey를 통해 참조했다고 하자.

 

- (가만히 있던)User 모델은 queryset에 자신을 참조한 review를 가지고 있다.

- User를 참조하고 있는 모든 Review 객체들을 반환하는 코드는 아래와 같다.

 

 cat.review_set.all()
 # cat은 User의 객체

  

- related_name : 연결된 객체(User)에서 연결하고 있는 객체(Review)를 찾기 위한 이름

 

name = models.ForeignKey(
    User,
    on_delete=models.CASCADE,
    related_name='reviews',
)

- 위와 같이 related_name을 입력하면 User에서 'review_set' 대신 'reviews'으로 Review 객체를 찾을 수 있다.

 

 

ManyToManyField와 related_name

 

- 기본 컨셉은 ForiegnKey와 동일

- 쌍 방향으로 객체를 호출할 수 있는 것이 차이점

 

  아래 코드에서 topping.pizza_set , pizza.toppings 모두 가능하다.

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

class Pizza(models.Model):
    toppings = models.ManyToManyField(Topping)

 

 

 

참고

docs.djangoproject.com/en/3.1/ref/models/relations/#django.db.models.fields.related.RelatedManager

docs.djangoproject.com/en/3.1/topics/db/managers/

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

 

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

Django / Model 메소드 오버라이딩  (0) 2021.02.25
Django / MEDIA_ROOT, MEDIA_URL  (0) 2021.02.24
Django / Meta Class & Abstract Base Class  (0) 2021.02.23
Django / ModelAdmin  (0) 2021.02.23
Django / ForeignKey 와 ManyToManyField  (0) 2021.02.23
Comments