이번엔 Django QuerySet API에 대해 공부한것을 적어보려고 합니다
list
로 반환된다iterable
한 객체이기 때문에 python 코드를 사용하여 여러가지로 응용할 수 있다QuerySet의 Method에는 정말 많은 종류의 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)
- 기준 필드를 지정해 ASC
나 DESC
(-
사용)로 정렬 할 수있고 기준 필드를 여러 개 지정할 수도 있음>>> Nutrition.objects.all().order_by('one_serving_kcal')
# <QuerySet [<Nutrition: Nutrition object (3)>, <Nutrition: Nutrition object (1)>, ···]>
distinct(*fields)
- 중복된 값은 하나만 표시하며 필드에 값을 지정하게 되면 order_by()
가 필수로 선행되어야 함
Django-MySQL
조합에서는 필드에 값을 지정할 수 없고PostgreSQL
에서만 필드에 값을 지정 가능함
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
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()
의 반대이 외에도 여러가지가 있는데 annotate
와 aggregate
는 정리할 내용이 많아서 다음에 추가로 정리 해 보도록 하겠다!
잘못된 부분이 있으면 Feedback 부탁드립니다!👊🏻👊🏻👊🏻👊🏻👊🏻👊🏻👊🏻👊🏻👊🏻👊🏻