[Django 공식문서 번역] Models - 5. Managers

이 글은 본인이 공부를 목적으로 공식문서를 읽으며 정리/번역한 글로서 오역이 있을 수 있을 수 있습니다. 또한 본인이 이미 알고 있거나 불필요하다 느끼는 내용들은 누락될 수 있습니다.

Managers

Manager는 장고 모델의 query operation이 제공되는 interface이다. 적어도 한개의 Manager는 각각의 model들에 존재한다.

Manager names

기본적으로 장고는 Manager를 objects라는 이름으로 모든 model class에 추가한다. 이는 각각의 model들에서 수정할 수 있다.

Manager의 이름수정하기:
class Person(models.Model):
    #...
    people = models.Manager()

Custom managers

기본 베이스 Manager를 확장하는 방법으로 custom Manager를 추가할 수 있다.

1. 새로운 Manager 메서드 추가하기:
Model에 table-level 기능을 추가할 때는 새로운 manager 메서드를 추가하는 것이 추천하는 방법이다.

custom Manager는 QuerySet이 아니더라도 아무 것이나 다 반환할 수 있다.

아래의 예시에서는 with_counts()메서드가 OpinionPoll 객체들과 함께 num_responses라는 필드를 추가하여 반환한다

from django.db import models

class PollManager(models.Manager):
    def with_counts(self):
        from django.db import connection
        with connection.cursor() as cursor:
            cursor.execute("""
                SELECT p.id, p.question, p.poll_date, COUNT(*)
                FROM polls_opinionpoll p, polls_response r
                WHERE p.id = r.poll_id
                GROUP BY p.id, p.question, p.poll_date
                ORDER BY p.poll_date DESC""")
            result_list = []
            for row in cursor.fetchall():
                p = self.model(id=row[0], question=row[1], poll_date=row[2])
                p.num_responses = row[3]
                result_list.append(p)
        return result_list

class OpinionPoll(models.Model):
    question = models.CharField(max_length=200)
    poll_date = models.DateField()
    objects = PollManager()

class Response(models.Model):
    poll = models.ForeignKey(OpinionPoll, on_delete=models.CASCADE)
    person_name = models.CharField(max_length=50)
    response = models.TextField()

2. Manager의 기본 QuerySet 변경하기
# First, define the Manager subclass.
class DahlBookManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(author='Roald Dahl')

# Then hook it into the Book model explicitly.
class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)

    objects = models.Manager() # The default manager.
    dahl_objects = DahlBookManager() # The Dahl-specific manager.

이 예시에서 Book.objects.all()은 database에 있는 모든 book들을 반환하지만 Book.dahl_objects.all()은 Ronald Dahl이 쓴 책만 반환할 것이다.










댓글

이 블로그의 인기 게시물

[Django REST Framework] create() vs perform_create()

[웹 보안] CORS란?

3. GRAPHQL FRAGMENTS