Django - CRUD

양희연·2020년 8월 27일
1

Django

목록 보기
5/14
post-thumbnail

💼 Model Manager

장고 모델에서 Manager는 데이터베이스 쿼리작업을 제공하는 인터페이스이다.
기본적으로 장고는 모델 클래스에 objects를 이름의 Manager를 추가한다. 모델.objects

#모델 import
from product.models import *

#데이터 모두 가져오기, 쿼리셋으로 반환
Menu.objects.all()

🖥 QuerySet

데이터베이스로부터 전달받은 모델의 객체 목록이다.

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'  


🎥 CRUD - 추가

> 모델 instance의 save 함수로 저장

c = Category(name = '콜드 브루', menu = Menu.objects.get(name = '음료'))
c.save()

> 모델 manager의 create 함수로 저장

Menu.objects.create(name = '음료')

Category.objects.create(
    name = '콜드 브루',
    menu = Menu.objects.get(name = '음료')
)


🎞 CRUD - 조회

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')


📽 CRUD - 수정

> 모델 instance의 save 함수로 저장

menu = Menu.objects.get(id = 1)
menu.name = '음료'
menu.save()

> update 함수로 일괄 수정

category = Category.objects.all()
category.update(menu_id = 1)


🚫 CRUD - 삭제

> 모델 instance의 delete 함수로 삭제

category = Category.objects.get(id = 3)
category.delete()

> delete 함수로 일괄 삭제

category = Category.objects.all()
category.delete()
profile
꾸준히 나아가자!

0개의 댓글