Django Queryset

김기현·2022년 2월 12일
0
post-thumbnail

Queryset?

쿼리셋(QuerySet)은 전달받은 모델의 객체 목록입니다.

쿼리셋 API을 이용해 데이터베이스로부터 데이터를 읽고, 필터를 걸거나 정렬을 할 수 있는데요! Caching, Eager Loading, Lazy Loading의 성질을 가지고 있습니다. 마지막의 성질 때문에 실제 데이터를 가져오기 위해서(fetch)는 Queryset를 iterate해야 하는데요!

from products.models import Menu
Menu.objects.all() # Menu 모델의 모든 데이터를 가져오기

>>> <QuerySet [<Menu: object1>, <Menu: object2>]>

objectsModelManager이며, Database와 Django Model사이의 인터페이스 역할을 합니다. 이때 반환되는 객체가 QuerySet입니다.

Menu.objects는 objects라는 이름의 manager가 Menu DB를 QuerySet형태로 만들겠다는 의미입니다.

QuerySet Method

QuerySet안에 있는 객체에 접근할 때에는 value에 접근하는지, dictionary의 요소에 접근하는지 등에 따라서 접근 방식이 다릅니다.

Queryset 반환하는 경우

쿼리셋 형식 (예시) : <QuerySet [<Category: Category object (1)>, <Category: Category object (2)>]>

  • all()
    한 테이블의 모든 쿼리들을 반환합니다. 그리고 queryset으로 반환합니다.
>>> Category.objects.all()
<QuerySet [<Category: Category object (1)>, <Category: Category object (2)>, <Category: Category object (3)>, <Category: Category object (4)>]>
  • filter() & exclude()
    필터를 사용해 특정 테이블을 가져올 수 있고 제외할 수 있습니다. 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)>]>
  • values()
    iterable로 사용될 때 모델 인스턴스가 아닌 dictionary를 포함하는 QuerySet을 반환합니다.
>>> 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': '토마토'}]>
  • values_list()
    dictionary를 반환하는 대신 반복될 때 튜플을 반환합니다.
>>> Drink.objects.filter(category_id=1).values_list()
<QuerySet [(5, 1, '나이트로 바닐라 크림', '', ''), (7, 1, '나이트로 쇼콜라 클라우드', '', '')]>
>>> Allergy.objects.exclude().values_list("name")
<QuerySet [('대두',), ('우유',), ('난류',), ('밀',), ('아황산류',), ('토마토',)]>

Queryset 반환하지 않는 경우

  • create
    class.objects.create() 사용
>>> Drink.objects.create(korean_name="빅아메리카노", category_id="2")
<Drink: Drink object (14)>

save() 사용
다른 방법으로 save()를 이용할 수 있습니다. save()는 Insert할 때 또는 Update에서 사용할 수 있습니다. 주의! 쿼리셋이 아닌 경우에만 사용할 수 있습니다!

>>> Drink(korean_name = "빅라떼").save()

  • get()
    지정된 조회 매개 변수와 일치하는 인스턴스를 반환합니다.
>>> Drink.objects.get(id=15)
<Drink: Drink object (15)>
  • update()
    지정된 필드에 대해 쿼리를 업데이트하고 일치하는 행 수를 반환합니다.

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
'스몰라떼'

변경된 데이터베이스 조회

  • delete()
    QuerySet의 모든 행에 대해 SQL 쿼리를 삭제하고 삭제가 된 개체의 수와 개체 유형별 삭제 횟수가 있는 dictionary를 반환합니다.
>>> Drink.objects.filter(id=16).delete()
(1, {'products.Drink': 1})
  • exists()
    filter()와 함께 사용해 filter 조건에 맞는 데이터가 있으면 True, 그렇지 않으면 False를 반환합니다.
>>> 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형으로 반환합니다.

참고한 블로그

profile
피자, 코드, 커피를 사랑하는 피코커

0개의 댓글