🐍Python | Django

[Django] QuerySet method

이줭 2022. 5. 12. 21:44
728x90

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 메서드들이 있지만 자주 쓰는 것들 위주로 정리해놓자!

 

참고 : https://devvvyang.tistory.com/37?category=973523

728x90

'🐍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