django의 쿼리셋에서 사용할 수 있는 메서드들에 대해 알아보자.
SELECT
all()
테이블 내의 모든 데이터를 조회하여, 쿼리셋 타입으로 반환해준다.
Product.objects.all()
# <QuerySet [<Product: 제품A>, <Product: 제품B>]>
get()
하나의 데이터를 조회하기 위한 메서드이며, 주로 pk로 조회한다. 결과가 1건 이상인 경우 에러를 발생시키고, 객체 타입으로 반환된다.
Product.objects.get(id=1)
# <Product: 제품A>
filter()
특정 조건에 맞는 row들만 조회할 때 사용하고, 쿼리셋으로 반환된다.
Product.objects.filter(Group_id = 1)
# <QuerySet [<Product: 제품A>, <Product: 제품B>]>
exclude()
특정 조건을 제외한 데이터만 조회하고 싶을 때 사용한다. 쿼리셋으로 반환된다.
Product.objects.exclude(Group_id = 1)
# <QuerySet [<Product: 제품C>, <Product: 제품D>]>
filter()와 exclude()에서 사용가능한 내장 모듈
__contains : 특정 문자(대소문자 구분)가 포함된 것 조회
__icontains : 대소문자 구분 없이 특정 문자가 포함된 것 조회
__startswith : 특정문자로 시작하는 것 조회
__endswith : 특정문자로 끝나는 것 조회
__gt : 특정 값보다 큰 데이터 조회
__lt : 특정 값보다 작은 데이터 조회
__in : 리스트 안에 지정된 항목들 중 하나라도 포함된 데이터 조회
Product.objects.filter(code__contains='prod')
Product.objects.filter(code__icontains='prod')
Product.objects.filter(code__startswith='p')
Product.objects.filter(code__endswith='d')
Product.objects.filter(id__gt=2)
Product.objects.filter(id__lt=3)
Product.objects.filter(id__in = [1, 2, 3])
filter() 시 AND / OR
AND : 두 개 이상의 쿼리셋을 & 로 연결
OR : 두 개 이상의 쿼리셋을 | 로 연결
Product.objects.filter(id__gt=3) & Product.objects.fitler(name__startswith='제품')
Product.objects.filter(id__gt=3) | Product.objects.fitler(name__startswith='제품')
또는 django의 Q객체로도 표현할 수 있다.
from django.db.models import Q
Product.objects.filter(Q(id__gt=3) & Q(name__contains='제품'))
Product.objects.filter(Q(id__gt=3) | Q(name__contains='제품'))
INSERT
create()
create를 사용하여 데이터를 생성할 수 있다.
Product.objects.create(code='prodA', name='제품A')
save()
빈 모델을 선언한 수 save 메서드를 사용하여 데이터를 생성할 수 있다.
product = Product()
product.code = 'prodA'
product.name = '제품A'
product.save()
UPDATE
save()
객체타입으로 가져와서 필드를 변경하고 저장할 수 있다.
product = Product.objects.get(id=3)
product.name = '제품C'
product.save()
product = Product.objects.filter(id=2).first()
product.name = '제품D'
product.save()
update()
아래와 같은 형태로 update를 사용할 수 있고, update의 경우 객체 타입으로 update를 시도하면 에러가 발생한다. 쿼리셋 형태에서 update를 사용할 수 있다.
update_dc = { 'name': '제품C' }
product = Product.objects.filter(id=2)
product.update(**update_dc)
DELETE
delete()
delete는 아래와 같이 사용할 수 있고, 객체 또는 쿼리셋 타입 모두 사용할 수 있다.
Product.objects.get(id=1).delete()
Product.objects.filter(id__in=[1, 2, 3]).delete()
이 글에 적힌 함수 뿐 아니라 많은 orm 메서드들이 있지만 자주 쓰는 것들 위주로 정리해놓자!
'🐍Python | Django' 카테고리의 다른 글
[Python] __new__ ? __init__ ? (0) | 2022.05.16 |
---|---|
[Django] ORM Eager Loading(select related & prefetch_related) (0) | 2022.05.15 |
[Django] QuerySet?! (0) | 2022.05.12 |
[Python] generator (0) | 2022.05.09 |
[Python] iterable? iterator? (0) | 2022.05.08 |