장고 모델에서 Manager는 데이터베이스 쿼리작업을 제공하는 인터페이스이다.
기본적으로 장고는 모델 클래스에 objects를 이름의 Manager를 추가한다. 모델.objects
#모델 import
from product.models import *
#데이터 모두 가져오기, 쿼리셋으로 반환
Menu.objects.all()
데이터베이스로부터 전달받은 모델의 객체 목록이다.
from product.models import *
Menu.objects.all()
#쿼리셋 반환
<QuerySet [<Menu: drink>]>
#models.py
class Menu(models.Model):
name = models.CharField(max_length = 50)
class Meta:
db_table = 'menus'
class Category(models.Model):
name = models.CharField(max_length = 50)
menu = models.ForeignKey('Menu', on_delete = models.SET_NULL, null = True)
class Meta:
db_table = 'categories'
c = Category(name = '콜드 브루', menu = Menu.objects.get(name = '음료'))
c.save()
Menu.objects.create(name = '음료')
Category.objects.create(
name = '콜드 브루',
menu = Menu.objects.get(name = '음료')
)
all()
모든 데이터 가져오기, 쿼리셋 반환
Menu.objects.all()
<QuerySet [<Menu: Menu object (1)>]>
#slicing
Category.objects.all()[2:]
<QuerySet [<Category: Category object (3)>]>
values()
모든 데이터를 딕셔너리 형태로 가져오기, 쿼리셋 반환
Menu.objects.values()
<QuerySet [{'id': 1, 'name': 'drink'}, {'id': 2, 'name': 'food'}]>
Menu.objects.values('id')
<QuerySet [{'id': 1}, {'id': 2}]>
filter()
조건에 맞는 데이터 가져오기, 쿼리셋 반환
Menu.objects.filter(name = 'drink')
<QuerySet [<Menu: Menu object (1)>]>
#exists()
Menu.objects.filter(name = 'drink').exists()
True
조 건 🔍
__
#__lt / __gt: 보다 작다 / 보다 크다
#__lte / __gte: 같거나 보다 작다 / 같거나 보다 크다
Category.objects.filter(id__lt = 2)
<QuerySet [<Category: Category object (1)>]>
#__in
Category.objects.filter(id__in = [1, 3])
<QuerySet [<Category: Category object (1)>, <Category: Category object (3)>]>
#__year / __month / __day: 해당 년/월/일 데이터 반환
#__contains: 지정한 문자열을 포함한 데이터 반환
#__icontains: i가 앞에 붙으면 대소문자 구별하지 않는다.
Category.objects.filter(name__contains = 'brew')
<QuerySet [<Category: Category object (1)>]>
#__startswith: 지정한 문자열로 시작하는 데이터 반환
#__istartswith: i가 앞에 붙으면 대소문자 구별하지 않는다.
Category.objects.filter(name__startswith = 'cold')
<QuerySet [<Category: Category object (1)>]>
#__endswith: 지정한 문자열로 끝나는 데이터 반환
#__iendswith: i가 앞에 붙으면 대소문자 구별하지 않는다.
Category.objects.filter(name__endswith = 'brew')
<QuerySet [<Category: Category object (1)>]>
#__isnull: 해당 열의 값이 null인 데이터 반환
Category.objects.filter(name__isnull = True)
<QuerySet []>
exclude
Category.objects.exclude(id = 1)
<QuerySet [<Category: Category object (2)>, <Category: Category object (3)>]>
and
Category.objects.filter(name = 'cold brew', menu_id = 1)
or
먼저 Q를 import 해야 한다.
from django.db.models import Q
#or (|)
Category.objects.all().filter(Q(name__istarswith = 'cold') | Q(menu_id = 1))
<QuerySet [<Category: Category object (1)>, <Category: Category object (2)>, <Category: Category object (3)>]>
#and (&)
Category.objects.all().filter(Q(name__icontains = 'cold') & Q(menu_id = 1))
<QuerySet [<Category: Category object (1)>]>
order_by()
정렬, 쿼리셋 반환
#오름차순
Category.objects.order_by('id')
<QuerySet [<Category: Category object (1)>, <Category: Category object (2)>, <Category: Category object (3)>]>
#내림차순
Category.objects.order_by('-id')
<QuerySet [<Category: Category object (3)>, <Category: Category object (2)>, <Category: Category object (1)>]>
get()
조건에 맞는 객체 하나 반환. 0 또는 2개 이상이면 error 발생
Menu.objects.get(id = 1)
first() / last()
조건 내에 첫번째 / 마지막 객체를 반환
조건에 맞는 데이터가 없으면 error를 발생시키지 않고 None
을 반환한다.
Menu.objects.first()
Menu.objects.last()
💡 chaining
Menu.objects.filter(name__contains='d').order_by('-name')
menu = Menu.objects.get(id = 1)
menu.name = '음료'
menu.save()
category = Category.objects.all()
category.update(menu_id = 1)
category = Category.objects.get(id = 3)
category.delete()
category = Category.objects.all()
category.delete()