Skip to content

Django QuerySet API reference-1 #

Find similar titles

3회 업데이트 됨.

Edit
  • 최초 작성자
  • 최근 업데이트
    shlee

Structured data

Category
Programming

QuerySet API reference #

QuerySet API #

Methods that return new QuerySets #

filter() #

  • filter(**kwargs)
  • 지정된 조회 매개 변수와 일치하는 개체를 포함하는 새 QuerySet을 반환합니다.


Entry.objects.filter(id=1)

exclude() #

  • exclude(**kwargs)
  • 지정된 조회 매개 변수와 일치하지 않는 개체를 포함하는 새 QuerySet을 반환합니다.


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

annotate() #

  • annotate(_args, *_kwargs)
  • QuerySet의 각 객체에 주석을 추가합니다.
  • 각 주석은 단순값, 모델 필드에 대한 참조, QuerySet의 각 객체외 관련된 집계(averages, sums 등) 이 있습니다.

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

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

블로그 모델은 entry_count 속성을 정의하지 않지만, 키워드 인수를 사용하여 집계 함수를 지정함으로써 주석의 이름을 제어할 수 있습니다.

>>> q = Blog.objects.annotate(number_of_entries=Count('entry'))

The number of entries on the first blog, using the name provided

>>> q[0].number_of_entries  
>>> 42

alias() #

  • alias(_args, *_kwargs)
  • annotate()와 동일하지만 QuerySet의 객체에 주석을 다는 대신 식을 저장하여 나중에 다른 QuerySet 메서드에서 다시 사용할 수 있도록 합니다.
  • 이 기능은 식 자체의 결과가 필요하지 않지만 필터링, 순서 지정 또는 복합식의 일부로 사용되는 경우에 유용합니다.
  • 사용되지 않는 값을 선택하지 않으면 데이터베이스에서 중복 작업이 제거되므로 성능이 향상됩니다.

예를 들어, 5개 이상의 항목이 있는 블로그를 찾으려고 하지만 정확한 항목 수에 관심이 없는 경우 다음을 수행할 수 있습니다.

>>> from django.db.models import Count
>>> blogs = Blog.objects.alias(entries=Count('entry')).filter(entries__gt=5)

alias()는 annotate(), exclude(), filter(), order_by() 및 update()와 함께 사용할 수 있습니다.

Blog.objects.alias(entries=Count('entry')).annotate(
entries=F('entries'),
).aggregate(Sum('entries'))

order_by() #

  • order_by(*fields)
  • 기본적으로 QuerySet에서 반환되는 결과는 모델의 Meta에 있는 주문 옵션에 의해 주어진 주문 튜플에 의해 정렬됩니다.
  • order_by 메서드를 사용하여 쿼리 집합별로 이 값을 재정의할 수 있습니다.


Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline')

위의 결과는 pub_date 내림차순으로 정렬된 후 헤드라인 오름차순으로 정렬됩니다. 앞에 있는 음의 기호는 내림차순을 나타냅니다.
무작위로 주문하려면 다음과 같이 "?"를 사용합니다.

Entry.objects.order_by('?')
  • 참고: order_by('?') 쿼리는 사용 중인 데이터베이스 백엔드에 따라 비싸고 느릴 수 있습니다.

다른 모델의 필드별로 정렬하려면 모델 관계를 쿼리할 때와 동일한 구문을 사용합니다. 즉, 필드 이름, 이중 밑줄(__) 및 새 모델에서 필드 이름순으로 조인할 모델 수가 많습니다.

Entry.objects.order_by('blog__name', 'headline')

다른 모델과의 관계인 필드를 기준으로 주문하려고 하면, Django는 관련 모델의 기본 순서를 사용하거나,
Meta.ordering이 지정되지 않은 경우 관련 모델의 기본 키로 주문합니다.

예를 들어, 블로그 모델에는 기본 순서가 지정되지 않았으므로:

Entry.objects.order_by('blog')

…다음과 동일:

Entry.objects.order_by('blog__id')

블로그에서 = ['name']을 주문하는 경우 첫 번째 쿼리 집합은 다음과 같습니다.

Entry.objects.order_by('blog__name')

다음 식에서 asc() 또는 desc()를 호출하여 쿼리 식별로 순서를 지정할 수도 있습니다.

Entry.objects.order_by(Coalesce('summary', 'headline').desc())

reverse() #

  • reverse()

쿼리 집합의 요소가 반환되는 순서를 반대로 하려면 reverse() 메서드를 사용합니다. reverse()를 두 번째로 호출하면 순서가 정상 방향으로 복원됩니다. 쿼리 집합의 "마지막" 5개 항목을 검색하려면 다음을 수행합니다.

my_queryset.reverse()[:5]

파이썬의 seq[-5:]와 같은 기능이지만, SQL에서는 효율적으로 할 수 없기 때문에 Django는 엑세스 모드를 지원하지 않습니다.
reverse()는 QuerySet이 순서가 정의되어 있을 때만 효과가 있습니다.

distinct() #

  • distinct(*fields)

SQL 쿼리에서 SELECT DISTINCT를 사용하는 새 QuerySet을 반환합니다. 이렇게 하면 쿼리 결과에서 중복된 행이 제거됩니다.

기본적으로 쿼리 집합은 중복 행을 제거하지 않습니다. Blog.objects.all()과 같은 단순한 쿼리는 결과 행이 중복될 가능성을 제기하지 않기 때문에 실제로 이것은 거의 문제가 되지 않습니다.
그러나 쿼리가 여러 테이블에 걸쳐 있는 경우 쿼리 집합이 평가될 때 중복된 결과를 얻을 수 있습니다.
그때가 바로 distinct()을 사용하는 때입니다.

주석

order_by() 호출에 사용되는 모든 필드는 SQL SELECT 열에 포함됩니다. 이 경우 distinct()과 함께 사용할 경우 예상치 못한 결과가 발생할 수 있습니다. 관련 모델에서 필드별로 정렬하면 해당 필드가 선택한 열에 추가되고, 그렇지 않으면 중복된 행이 구별되는 것처럼 보일 수 있습니다. 추가 열은 반환된 결과에 나타나지 않으므로(순서를 지원하기 위해 있음) 구별되지 않는 결과가 반환되는 것처럼 보일 수 있습니다.마찬가지로 values() 쿼리를 사용하여 선택한 열을 제한하는 경우에도 order_by()(또는 기본 모델 순서)에 사용된 열이 계속 포함되며 결과의 고유성에 영향을 줄 수 있습니다.여기서 교훈은 distinct()을 사용하는 경우 관련 모델에 의한 주문에 주의해야 한다는 것입니다. 마찬가지로 distinct()과 values()을 함께 사용할 경우 values() 호출에 포함되지 않는 필드를 기준으로 정렬할 때는 주의해야 합니다.

Postgre에서SQL만 사용할 수 있으며 위치 인수(*fields)를 전달하여 DISTINCT를 적용할 필드 이름을 지정할 수 있습니다. 이는 SELECT DISTINCT ON SQL 쿼리로 변환됩니다. 여기 차이점이 있습니다. 일반 distinct() 호출의 경우 데이터베이스는 구별되는 행을 결정할 때 각 행의 각 필드를 비교합니다. 지정된 필드 이름을 가진 distinct() 호출의 경우 데이터베이스는 지정된 필드 이름만 비교합니다.

주석

필드 이름을 지정할 때 QuerySet에서 order_by()를 제공해야 하며 order_by()의 필드는 동일한 순서로 distinct()의 필드로 시작해야 합니다.예를 들어, SELECT DISTINCT ON(a)은 열 a의 각 값에 대한 첫 번째 행을 제공합니다. 순서를 지정하지 않으면 임의 행이 표시됩니다.

예시 (첫 번째 이후의 예제는 Postgre에서만 작동합니다.SQL)

>>> Author.objects.distinct()
[...]

>>> Entry.objects.order_by('pub_date').distinct('pub_date')
[...]

>>> Entry.objects.order_by('blog').distinct('blog')
[...]

>>> Entry.objects.order_by('author', 'pub_date').distinct('author', 'pub_date')
[...]

>>> Entry.objects.order_by('blog__name', 'mod_date').distinct('blog__name', 'mod_date')
[...]

>>> Entry.objects.order_by('author', 'pub_date').distinct('author')
[...]

출처 : https://docs.djangoproject.com/ko/4.1//ref/models/querysets/

Suggested Pages #

0.0.1_20230725_7_v68