TIL | Django | 공식 문서 정리 | QuerySet API 1편

이도운·2022년 1월 8일
0

TIL

목록 보기
36/73
post-thumbnail

QuerySets이 실행될 때

당신은 다음과 같은 방법으로 QuerySet을 실행할 수 있습니다.

  • Iteration
for e in Entry.objects.all():
    print(e.headline)
  • Slicing
  • Pickling / Caching
  • repr()
  • len()
  • list()
entry_list = list(Entry.objects.all())
  • bool()
    • 하나 이상의 결과가 있으면 True, 없으면 False 입니다.
if Entry.objects.filter(headline="Test"):
   print("There is at least one Entry with the headline Test")

Query API

새로운 QuerySets을 반환하는 메소드

filter()

주어진 매개변수와 일치하는 새로운 개체를 반환합니다.

여러 매개면수는 AND 기본 SQL 문을 통해 조인됩니다.

exclude()

주어진 매개변수와 일치하지 않는 새로운 개체를 반환합니다.

여러 매개변수는 AND 기본 SQL 문을 통해 조인되며 전체가 NOT() 입니다.

Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3), headline='Hello')

위의 코드는 아래와 같습니다.

SELECT ...
WHERE NOT (pub_date > '2005-1-3' AND headline = 'Hello')

annotate()

제공된 쿼리 표현식으로 QuerySet 각 객체에 annotate를 답니다

식은 단순 값, 모델의 필드에 대한 참조 또는 QuerySet 개체와 관련된 개체에 대해 계산된 집계 식일 수 있습니다.

annotate()에 대한 인수는 반환 되는 QuerySet 각 객체에 추가될 annoate입니다.

예를 들어, 블로그 목록을 조작하는 경우 각 블로그에 작성된 항목 수를 확인할 수 있습니다.

>>> from django.db.models import Count
>>> q = Blog.objects.annotate(Count('entry'))
# The name of the first blog
>>> q[0].name
'Blogasaurus'
# The number of entries on the first blog
>>> q[0].entry__count
42

alias()

annotate()와 같지만 객체에 annoate를 추가하는 대신 나중에 다른 QuerySet 메소드에서 재사용할 수 있도록 표현식을 저장합니다.

orderby()

기본적으로 QuerySet은 모델의 Meta의 ordering에 결과를 낸다. 하지만 orderby() 메서드를 사용하여 재정의할 수 있다.

reverse()

이 메서드를 사용하여 쿼리 집합의 요소가 반환되는 순서를 반대로 할 수 있습니다. 두번 호출하면 순서가 다시 정상으로 돌아옵니다.

distinct()

SELECT DISTINT를 사용 하는 새 QuerySey 항목을 반환합니다. 이렇게 하면 쿼리 결과ㅏ에서 중복 행이 제거됩니다.

values()

Iteralbe로 사용될 때 모델 인스턴스가 아닌 사전을 반환하는 QuerySey을 반환합니다.

각 사전은 모델 개체의 속성 이름에 해당하는 키를 사용하여 개체를 나타냅니다.

# This list contains a Blog object.
>>> Blog.objects.filter(name__startswith='Beatles')
<QuerySet [<Blog: Beatles Blog>]>

# This list contains a dictionary.
>>> Blog.objects.filter(name__startswith='Beatles').values()
<QuerySet [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]>

values_list()

values()가 사전을 반환한다면 이것은 튜플을 반환한다는 점을 제외하고는 대체로 비슷합니다.

dates()

날짜를 나타내는 값을 반환합니다.

DateField 모델이어야 합니다.

datetimes()

dates()와 비슷합니다.

DateTimeField 모델이어야 합니다.

none()

개체를 반환하지 않는 QuerySet가 생성됩니다.

all()

현재의 복사본을 반환합니다.

union()

SQL의 UNION 연산자를 사용하여 둘 이상의 결과를 결합합니다.

qs1.union(qs2, qs3)

intersection()

SQL의 INTERSECT 연산자를 사용하여 둘 이상의 공유 요소를 반환합니다.

qs1.intersection(qs2, qs3)

difference()

SQL의 EXCEPT 연산자를 사용하여 한 쪽에는 존재하지만 다른 쪽에는 존재하지 않는 요소만 유지합니다.

qs1.difference(qs2, qs3)

이것은 하나의 더 복잡한 쿼리를 생성하지만 나중에 외래 키 관계를 사용할 때 데이터 베이스 쿼리가 필요하지 않다는 것을 의미하는 성능 부스터입니다.

일반적인 경우는 아래와 같다.

# Hits the database.
e = Entry.objects.get(id=5)

# Hits the database again to get the related Blog object.
b = e.blog

select_related()를 사용했을 때는 아래와 같다.

# Hits the database.
e = Entry.objects.select_related('blog').get(id=5)

# Doesn't hit the database, because e.blog has been prepopulated
# in the previous query.
b = e.blog

select_related()는 수행할 수 없는 다대다 및 다대일 개체를 미리 가져올 수 있다.

extra()

복잡한 WHERE를 쉽게 표현하기 위해 준비된 API다.

defer()

일부복잡한 데이터 모델링 상황에서 어던 모델은 많은 필드를 갖고 있을 수 있다. 이 때 해당 필드를 검색하지 않도록 지시할 수 있다.

only()

defet()와 반대다. 지정한 필드만 즉시 불러온다.

using()

이 메소드는 데이터베이슬 제어하기 위한 것이다.

# queries the database with the 'default' alias.
>>> Entry.objects.all()

# queries the database with the 'backup' alias
>>> Entry.objects.using('backup')

select_for_update()

동시성 문제가 생길 때 사용하는 메소드다.

raw()

원시 SQL 쿼리를 가져와 실행하고 RawQuerySet 인스턴스를 반환합니다.

참고

장고 공식 문서
https://docs.djangoproject.com/ko/4.0/ref/models/querysets/#annotate

https://brownbears.tistory.com/553

profile
⌨️ 백엔드개발자 (컴퓨터공학과 졸업)

0개의 댓글