Django QuerySet API

Junyoung Lee·2021년 6월 28일
0

Django

목록 보기
4/4

이번엔 Django QuerySet API에 대해 공부한것을 적어보려고 합니다


Django QuerySet API?

  • Django에 내장된 일반적인 Data관리 기능이며 DB테이블을 필터링, 분할, 정렬 등 여러가지 기능을 사용할 수 있고 Data를 관리하기 위해서는 필수로 익혀야 하는 부분이다
  • QuerySet method를 실행했을때 QuerySet 을 반환하거나 그렇지 않은 경우로 나뉘며 반환될 경우 QuerySet은 list로 반환된다
  • QuerySet은 iterable한 객체이기 때문에 python 코드를 사용하여 여러가지로 응용할 수 있다

QuerySet Method의 종류

QuerySet의 Method에는 정말 많은 종류의 Method가 있는데 전부는 아니더라도 어느정도 정리 해보려고 한다👦🏻

QuerySet을 반환하는 Method

  • filter(**kwargs) - 키워드 인자로 주어진 조건에 일치하는 데이터들의 QuerySet을 반환함
>>> Product.objects.filter(allergies__name='우유')
#<QuerySet [<Product: 나이트로 바닐라 크림>, <Product: 돌체 카라멜 칩 커피 프라푸치노>, 
#<Product: 아이스 제주 까망 라뗴>, <Product: 트러플 머쉬룸 수프>, <Product: 포테이통통 샌드위치>]>
  • exclude(**kwargs) - 주어진 조건에 일치하지 않는 값을 조회
>>> Product.objects.exclude(allergies__name='우유')
# <QuerySet [<Product: 딸기 레몬 블렌디드>, <Product: 패션 탱고 티 레모네이드 피지오>]>
  • all() - 한 테이블의 모든 레코드를 가져오기 위해서 사용
>>> for name in Product.objects.all():
        print(name.korean_name)

#나이트로 바닐라 크림
#돌체 카라멜 칩 커피 프라푸치노
#아이스 제주 까망 라뗴
#딸기 레몬 블렌디드
#패션 탱고 티 레모네이드 피지오
#트러플 머쉬룸 수프
#포테이통통 샌드위치
  • values() - iterable로 사용될 때 모델 인스턴스가 아닌 dict를 포함하는 QuerySet을 반환
>>> Allergy.objects.filter(pk=3).values()
# <QuerySet [{'id': 3, 'name': '우유'}]>
  • values_list() - values()와 유사하지만 dict가 아닌 tuple로 반환함
>>> Allergy.objects.filter(pk=4).values_list()
# <QuerySet [(4, '난류')]>
  • order_by(*fields) - 기준 필드를 지정해 ASCDESC(-사용)로 정렬 할 수있고 기준 필드를 여러 개 지정할 수도 있음
>>> Nutrition.objects.all().order_by('one_serving_kcal')
# <QuerySet [<Nutrition: Nutrition object (3)>, <Nutrition: Nutrition object (1)>, ···]>
  • distinct(*fields) - 중복된 값은 하나만 표시하며 필드에 값을 지정하게 되면 order_by()가 필수로 선행되어야 함

Django-MySQL조합에서는 필드에 값을 지정할 수 없고PostgreSQL에서만 필드에 값을 지정 가능함

QuerySet을 반환하지 않는 Method

  • create(**kwargs) - 테이블에 데이터를 INSERT해줌, 생성된 인스턴스 반환
>>>Product.objects.create(category_id=6, korean_name='에스프레소 마키아또',
   ...: english_name='Espresso Macchiato', description='신선한 에스프레소 샷에
   ...: 우유 거품을 살짝 얹은 커피 음료로써, 강렬한 에스프레소의 맛과 우유의 부
   ...: 드러움을 같이 즐길 수 있는 커피 음료')
# <Product: 에스프레소 마키아또>
  • get(**kwargs) - 지정된 조회 매개 변수와 일치하는 인스턴스 반환, Unique한 값이 있는 경우만 가져올 수 있음
>>>Category.objects.get(pk=1)
# <Category: 콜드 브루 커피>
  • get_or_create(defaults=None, **kwargs) - 객체를 (object, created)라는 튜플로 반환한다. object는 꺼내려고 하는 모델의 인스턴스, created는 boolean flag
    True라면 get_or_create에 의해 생성되었다는 것을 의미하고 False는 DB에서 가져왔다는 것을 의미
>>>Category.objects.get_or_create(name='과일 & 요거트', menu_id=2)
# (<Category: 과일 & 요거트>, True)
  • update(**kwargs) - 지정된 필드에 업데이트 쿼리를 수행하고 일치하는 행 수를 반환함(일부 행에 이미 새 값이 있는 경우 업데이트 된 행 수와 같지 않을 수 있음)
>>>Category.objects.filter(name='탄산').update(name='콜드브루')
# 2 <- 총 업데이트 된 row 개수
  • delete() - QuerySet의 모든 행에 대해 삭제를 실행하고 삭제 된 개체 수와 유형별 삭제 횟수가 있는 dict를 반환
>>>Product.objects.get(korean_name='7월 출시').delete()
# (1, {'products.Product': 1})
  • save() - INSERT 또는 UPDATE를 수행함. 단일 객체에 대해서 업데이트를 수행할 때 많이 사용
In  : category = Category.objects.get(id=2)
Out : <Category: Category object (2)>

In  : category.name
Out : '브루드커피'

In  : category.name = 'new name'
In  : category.save()

In  : category.name
Out : 'new name'
  • exists() - filter()와 함께 사용하여 filter 조건에 맞는 데이터가 있는지 조회하고 존재하면 True, 아니라면 False 반환
>>>Product.objects.filter(category_id=3).exists()
# False
  • bulk_create(objs, batch_size=None, ignore_conflicts=False) - 한 번의 요청으로 테이블에 대량의 레코드 생성
>>>Category.objects.bulk_create([Category(menu_id=2, name='아이스크림'),
    ...: Category(menu_id=2, name='스낵 & 미니 디저트')])
# [<Category: 아이스크림>, <Category: 스낵 & 미니 디저트>]
  • count() - row 숫자를 세기 위해 사용
>>>Category.objects.count()
# 18
  • first() - QuerySet에서 첫 번째 인스턴스를 반환한다
>>>Actor.objects.all().first()
# <Actor: Actor object (2)>
  • last() - first()의 반대

이 외에도 여러가지가 있는데 annotateaggregate는 정리할 내용이 많아서 다음에 추가로 정리 해 보도록 하겠다!

잘못된 부분이 있으면 Feedback 부탁드립니다!👊🏻👊🏻👊🏻👊🏻👊🏻👊🏻👊🏻👊🏻👊🏻👊🏻

profile
🎹재즈를 사랑하는 백엔드 개발자 이준영입니다🎷

0개의 댓글