참고
Django Documentation - Managers
장고 orm을 사용할 때 늘 사용했던 건데 이게 뭘까라고 생각해보지는 않았던 것 같다.
아래 코드 부분에 objects 부분이다.
# ex
user = User.objects.get(id=1)
objects라는 Manager(django.db.models.Manager) 객체를 자동으로 추가한다. 때문에 별도의 Manager추가 없이 쿼리셋을 사용할 수 있다.from django.db import models
class Person(models.Model):
#...
people = models.Manager()
user.people.all()
그럼 왜 manager 객체를 왜 custom하는걸까?
django 문서에 따르면
OpinionPoll.objects.with_counts()을 통해 가져올 수 있다. from django.db import models
from django.db.models.functions import Coalesce
class PollManager(models.Manager):
def with_counts(self):
return self.annotate(
num_responses=Coalesce(models.Count("response"), 0)
)
# 여론조사 - 질문
class OpinionPoll(models.Model):
question = models.CharField(max_length=200)
objects = PollManager()
# 여론조사 - 답변
class Response(models.Model):
poll = models.ForeignKey(OpinionPoll, on_delete=models.CASCADE)
# ...
아래 내용은 내가 이해한 것을 작성한 것이라 틀릴 수 있다.
# table-level
class ActiveUserManager(models.Manager):
def get_queryset(self):
return superr().get_queryset().filter(is_active=True)
class User(models.Model):
first_name = models.CharField()
last_name = models.CharField()
active_user = ActiveUserManager()
# row-level
def get_fullname(self):
return self.first_name + self.last_name
Book.objects.all()은 모든 Book에 대해 리턴할 것이다.from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
get_queryset()을 재정의하여 Manager의 기본 쿼리셋을 재정의할 수 있다.objects : 기본 Manager - 즉 모든 Book 객체를 가져온다.dahl_objects : author가 Roald Dahl인 Book 객체만 가져온다. get_queryset메소드는 반드시 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.dahl_objects.filter(title='Matilda')
Book.dahl_objects.count()