[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이 쓴 책만 반환할 것이다.
댓글
댓글 쓰기