Django ORM queryset 비교

chaerin·2021년 1월 31일
1

Django

목록 보기
4/4

all() vs values()

all()

all()은 객체만 출력한다.

>>> Menu.objects.all()
<QuerySet [<Menu: 음료>, <Menu: 푸드>, <Menu: 상품>, <Menu: 카드>, <Menu: 메뉴 이야기>]>

values()

values()는 딕셔너리 타입으로 출력한다.

>>> Menu.objects.values()
<QuerySet [{'id': 1, 'name': '음료'}, {'id': 2, 'name': '푸드'}, {'id': 3, 'name': '상품'}, {'id': 4, 'name': '카드'}, {'id': 5, 'name': '메뉴 이야기'}]>

get() vs filter()

filter()

filter()는 조건에 맞는 쿼리셋(객체 여러개)을 반환한다.

>>> Drink.objects.filter(category_id=1)
<QuerySet [<Drink: 나이트로 바닐라 크림>, <Drink: 나이트로 콜드 브루>, <Drink: 돌체 콜드 브루>]>

get()

get()은 쿼리에 맞는 객체 하나만 반환한다.

>>> Drink.objects.get(category_id=1)

.
.
.
products.models.Drink.MultipleObjectsReturned: get() returned more than one Drink -- it returned 3!

filter() 예시에서 filter를 get으로 바꾼 결과, 위와 같은 예외를 확인할 수 있었다.

✅ get()을 사용할 때는 객체 하나만을 결과로 출력할 수 있을 때 사용하는 걸로!

>>> Drink.objects.get(id=1)
<Drink: 나이트로 바닐라 크림>

>>> Drink.objects.filter(category_id=1).first()
<Drink: 나이트로 바닐라 크림>

get()은 filter().first()와 같다고 볼 수 있다.

create() vs save()

create()

객체를 만드는 동시에 저장까지 한다.

Menu 클래스에 다섯개의 객체가 존재한다.

>>> Menu.objects.all()
<QuerySet [<Menu: Menu object (1)>, <Menu: Menu object (2)>, <Menu: Menu object (3)>, <Menu: Menu object (4)>, <Menu: Menu object (5)>]>

create()를 사용하여 객체를 생성하고 확인해보면 아래와 같이 객체가 하나 더 추가된 것을 확인할 수 있다.

>>> Menu.objects.create(name="상품")
<Menu: Menu object (6)>
>>> Menu.objects.all()
<QuerySet [<Menu: Menu object (1)>, <Menu: Menu object (2)>, <Menu: Menu object (3)>, <Menu: Menu object (4)>, <Menu: Menu object (5)>, <Menu: Menu object (6)>]>

save()

모델 클래스에 인자를 전달하여 호출한 뒤 save()하면 객체를 생성 또는 변경할 수 있다.

>>> a = Menu.objects.first()
>>> a.__dict__
{'_state': <django.db.models.base.ModelState object at 0x7fc5c27dd8e0>, 
 'id': 1, 'name': '음료'}

a가 가진 name 컨텐츠를 '푸드'로 바꾸고 save()를 하면 아래와 같이 정보가 변경된 것을 확인할 수 있다.

>>> a.name = '푸드'
>>> a.save()
>>> Menu.objects.first().__dict__
{'_state': <django.db.models.base.ModelState object at 0x7fc5c27dd9a0>, 
 'id': 1, 'name': '푸드'}

0개의 댓글