In : from products.models import Menu, Category, Product
In : menu = Menu.objects.all()
In : menu
Out : <QuerySet [<Menu: Menu object (1)>, <Menu: Menu object (2)>]>
In : type(menu)
Out : django.db.models.query.QuerySet
In : Menu.objects.create(name='음료')
Out : <Menu: 음료>
create()
는 Model instance를 save()
로 저장하는 방식과 동일하다.In : menu = Menu(name='푸드')
In : menu.save()
In : Menu.objects.bulk_create([name='상품', name='카드'])
Out : [<Menu: 상품>, <Menu: 카드>]
(object, created)
와 같이 튜플 형태로 반환된다. object
에는 가져오거나 생성된 객체가 담기고, created
에는 객체의 생성 여부가 담기는데 해당 객체가 생성된 것이라면 True
, 데이터베이스에서 가져온 것이라면 False
이다.In : Category.objects.get_or_create(name='콜드 브루 커피', menu_id='1')
Out : (<Category: 콜드 브루 커피>, False)
In : Category.objects.get_or_create(name='에스프레소', menu_id='1')
Out : (<Category: 에스프레소>, True)
# id가 1인 카테고리 값 조회
In : Category.objects.get(id=1)
Out : <Category: 콜드 브루 커피>
DoesNotExist
에러, 2개 이상이면MultipleObjectsReturned
에러 발생하므로, 찾고자 하는 값이 1개일 때 사용한다.# 조회된 값이 2개 이상일 경우
MultipleObjectsReturned: get() returned more than one Category
-- it returned more than 2!
# 조회된 값이 없을 경우
DoesNotExist: Category matching query does not exist.
In : Menu.objects.all()
Out : <QuerySet [<Menu: 상품>, <Menu: 음료>, <Menu: 카드>, <Menu: 푸드>]>
In : Menu.objects.values()
Out : <QuerySet [{'id': 3, 'name': '상품'}, {'id': 1, 'name': '음료'}, {'id': 4, 'name': '카드'}, {'id': 2, 'name': '푸드'}]>
In : Menu.objects.values('name')
Out : <QuerySet [{'name': '상품'}, {'name': '음료'}, {'name': '카드'}, {'name': '푸드'}]>
In : Menu.objects.values_list()
Out : <QuerySet [(3, '상품'), (1, '음료'), (4, '카드'), (2, '푸드')]>
In : Category.objects.filter(name='브루드 커피').exists()
Out : True
# Category 데이터 중 음료 Menu를 참조하고 있는 데이터 출력
# 방법 1
In : Category.objects.filter(menu_id=1)
Out : <QuerySet [<Category: 콜드 브루 커피>, <Category: 블렌디드>, <Category: 프라푸치노>, <Category: 브루드 커피>, <Category: 에스프레소>]>
# 방법 2
In : Category.objects.filter(menu__name='음료')
Out : <QuerySet [<Category: 콜드 브루 커피>, <Category: 블렌디드>, <Category: 프라푸치노>, <Category: 브루드 커피>, <Category: 에스프레소>]>
get()
과는 달리DoesNotExist
에러 발생하지 않고 빈 쿼리셋이 반환된다.In : Category.objects.filter(menu_id=4)
Out : <QuerySet []>
filter()
와 반대로, 해당 테이블에서 lookup 조건에 맞지 않은 레코드를 조회한다.In : Category.objects.exclude(menu__name='음료')
Out : <QuerySet [<Category: 머그>, <Category: 브레드>, <Category: 케이크>]>
filter()
메소드 사용 시, AND 조건은 &로, OR 조건은 | 로 사용한다.# AND 조건
In : Product.objects.filter(is_new=1) & Product.objects.filter(category=2)
Out : <QuerySet [<Product: 딸기 젤리 블렌디드>]>
# OR 조건
In : Product.objects.filter(is_new=1) | Product.objects.filter(category=2)
Out : <QuerySet [<Product: 나이트로 바닐라 크림>, <Product: 딸기 젤리 블렌디드>, <Product: 딸기 요거트 블렌디드>, <Product: 망고 바나나 블렌디드>]>
In : Product.objects.filter(is_new=1, category_id=2)
Out : <QuerySet [<Product: 딸기 젤리 블렌디드>]>```
In : from django.db.models import Q # Q 모듈을 import해야 Q 객체를 사용할 수 있다.
In : Product.objects.filter(Q(is_new=1) | Q(category_id=2))
Out : <QuerySet [<Product: 나이트로 바닐라 크림>, <Product: 딸기 젤리 블렌디드>, <Product: 딸기 요거트 블렌디드>, <Product: 망고 바나나 블렌디드>]>
In : Category.objects.first()
Out : <Category: 콜드 브루 커피>
In : Category.objects.last()
Out : <Category: 에스프레소>
In : Product.objects.filter(category_id=2).count()
Out : 3
In : Product.objects.order_by('korean_name')
Out : <QuerySet [<Product: 나이트로 바닐라 크림>, <Product: 나이트로 콜드 브루>, <Product: 돌체 콜드 브루>, <Product: 딸기 요거트 블렌디드>, <Product: 딸기 젤리 블렌디드>, <Product: 망고 바나나 블렌디드>, <Product: 제주 쑥떡 크림 프라푸치노>, <Product: 카라멜 마키아또>]>
In : Product.objects.order_by('-korean_name')
Out : <QuerySet [<Product: 카라멜 마키아또>, <Product: 제주 쑥떡 크림 프라푸치노>, <Product: 망고 바나나 블렌디드>, <Product: 딸기 젤리 블렌디드>, <Product: 딸기 요거트 블렌디드>, <Product: 돌체 콜드 브루>, <Product: 나이트로 콜드 브루>, <Product: 나이트로 바닐라 크림>]>
In : Product.objects.filter(id=6).update(description='망고 바나나 듬뿍 블렌디드')
Out : 1 # 업데이트된 row 개수
update()
는 Model instance의 속성을 변경하고 save()
로 저장하는 방식과 동일하다.product = Product.objects.get(id=6)
product.description = '망고 바나나 듬뿍 블렌디드'
product.save()
get()
, filter()
, all()
과 함께 사용할 수 있다.In : Product.objects.filter(category_id=8).delete()
Out : (3, {'products.Image': 1, 'products.AllergyProduct': 1, 'products.Product': 1})
참고사이트
https://docs.djangoproject.com/en/3.1/ref/models/querysets/
https://wayhome25.github.io/django/2017/04/01/django-ep9-crud/
https://kimdoky.github.io/django/2020/02/03/django-queryset-api/
https://velog.io/@magnoliarfsit/ReDjango-7.-ORM%EA%B3%BC-Queryset
https://velog.io/@inyong_pang/Django-QuerySet
https://devvvyang.tistory.com/37?category=973523