쿼리셋(QuerySet)은 전달받은 모델의 객체 목록입니다.
쿼리셋 API을 이용해 데이터베이스로부터 데이터를 읽고, 필터를 걸거나 정렬을 할 수 있는데요! Caching
, Eager Loading
, Lazy Loading
의 성질을 가지고 있습니다. 마지막의 성질 때문에 실제 데이터를 가져오기 위해서(fetch)는 Queryset를 iterate해야 하는데요!
from products.models import Menu
Menu.objects.all() # Menu 모델의 모든 데이터를 가져오기
>>> <QuerySet [<Menu: object1>, <Menu: object2>]>
objects
는 ModelManager이며, Database와 Django Model사이의 인터페이스 역할을 합니다. 이때 반환되는 객체가 QuerySet
입니다.
Menu.objects
는 objects라는 이름의 manager가 Menu DB를 QuerySet형태로 만들겠다는 의미입니다.
QuerySet안에 있는 객체에 접근할 때에는 value에 접근하는지, dictionary의 요소에 접근하는지 등에 따라서 접근 방식이 다릅니다.
쿼리셋 형식 (예시) : <QuerySet [<Category: Category object (1)>, <Category: Category object (2)>]>
>>> Category.objects.all()
<QuerySet [<Category: Category object (1)>, <Category: Category object (2)>, <Category: Category object (3)>, <Category: Category object (4)>]>
filter(**kwargs)
를 사용해 주어진 조건을 제시하며 조건이 없을 경우 all()과 같이 모든 값을 가져옵니다.>>> Drink.objects.filter(category_id=1)
<QuerySet [<Drink: Drink object (5)>, <Drink: Drink object (7)>]>
>>> Drink.objects.exclude(category_id=1)
<QuerySet [<Drink: Drink object (8)>, <Drink: Drink object (9)>, <Drink: Drink object (13)>, <Drink: Drink object (10)>, <Drink: Drink object (11)>]>
id
로 불러오는 것이 아닌 필드value로 가져오는 경우는 __
로 가져옵니다!
>>> Category.objects.filter(menu__name="음료")
<QuerySet [<Category: Category object (1)>, <Category: Category object (2)>]>
>>> Drink.objects.filter(category_id=1).values()
<QuerySet [{'id': 5, 'category_id': 1, 'korean_name': '나이트로 바닐라 크림', 'english_name': '', 'description': ''}, {'id': 7, 'category_id': 1, 'korean_name': '나이트로 쇼콜라 클라우드', 'english_name': '', 'description': ''}]>
>>> Allergy.objects.exclude().values("name")
<QuerySet [{'name': '대두'}, {'name': '우유'}, {'name': '난류'}, {'name': '밀'}, {'name': '아황산류'}, {'name': '토마토'}]>
>>> Drink.objects.filter(category_id=1).values_list()
<QuerySet [(5, 1, '나이트로 바닐라 크림', '', ''), (7, 1, '나이트로 쇼콜라 클라우드', '', '')]>
>>> Allergy.objects.exclude().values_list("name")
<QuerySet [('대두',), ('우유',), ('난류',), ('밀',), ('아황산류',), ('토마토',)]>
>>> Drink.objects.create(korean_name="빅아메리카노", category_id="2")
<Drink: Drink object (14)>
save() 사용
다른 방법으로 save()를 이용할 수 있습니다. save()는 Insert할 때 또는 Update에서 사용할 수 있습니다. 주의! 쿼리셋이 아닌 경우에만 사용할 수 있습니다!
>>> Drink(korean_name = "빅라떼").save()
>>> Drink.objects.get(id=15)
<Drink: Drink object (15)>
class.objects.update() 사용
>>> Drink.objects.filter(korean_name="빅라떼").update(category_id="2")
1 # 총 업데이트가 된 row 개수
변경된 데이터베이스 조회
save() 사용
>>> drink = Drink.objects.get(id=15)
>>> drink.korean_name
'빅라떼'
>>> drink.korean_name = "스몰라떼"
>>> drink.save()
>>> drink.korean_name
'스몰라떼'
변경된 데이터베이스 조회
>>> Drink.objects.filter(id=16).delete()
(1, {'products.Drink': 1})
>>> Drink.objects.filter(id=15).exists()
True
>>> Drink.objects.filter(id=16).exists()
False
get_or_create()
objects를 조회할 때 유용하게 사용하는 메서드로, (objects, created)라는 튜플 형식으로 반환합니다.
count()
일치하는 데이터베이스의 개체 수를 나타내는 정수를 반환합니다.
first(), last()
QuerySet과 일치하는 각각 첫 번째, 마지막 개체를 반환하고 일치하는 개체가 없을 경우 None을 반환합니다.
aggregate()
합계, 카운트, 평균, 최대값, 최소값을 계산하여 dictionary형으로 반환합니다.