Django에서 쿼리 세트 정렬하기: 오름차순 및 내림차순
오름차순 정렬
쿼리 세트를 특정 필드 기준으로 오름차순으로 정렬하려면 order_by
함수에 해당 필드 이름을 문자열로 전달하면 됩니다. 예를 들어, User
모델의 date_joined
필드 기준으로 사용자를 오름차순으로 정렬하려면 다음 코드를 사용합니다.
from django.db import models
class User(models.Model):
# ...
date_joined = models.DateTimeField()
users = User.objects.all().order_by('date_joined')
위 코드는 date_joined
필드 값이 가장 작은 사용자부터 가장 큰 사용자 순으로 사용자를 포함하는 QuerySet
을 반환합니다.
내림차순 정렬
users = User.objects.all().order_by('-date_joined')
여러 필드 기준 정렬
여러 필드 기준으로 쿼리 세트를 정렬하려면 order_by
함수에 필드 이름을 쉼표로 구분하여 여러 개 전달할 수 있습니다. 예를 들어, User
모델의 last_name
및 first_name
필드 기준으로 사용자를 정렬하려면 다음 코드를 사용합니다.
users = User.objects.all().order_by('last_name', 'first_name')
위 코드는 먼저 last_name
필드를 기준으로 사용자를 정렬하고, last_name
값이 동일한 사용자는 first_name
필드를 기준으로 정렬합니다.
관련 자료
추가 정보
order_by
함수는 쿼리 결과에 영향을 미치지만 데이터베이스 자체를 변경하지 않습니다.- 정렬하려는 필드가 인덱스가 설정되어 있으면 쿼리 성능이 향상될 수 있습니다.
order_by
함수는QuerySet
객체에만 사용할 수 있습니다. 단일 모델 인스턴스에는 사용할 수 없습니다.
예제 코드
예제 1: User
모델의 date_joined
필드 기준으로 사용자를 오름차순으로 정렬합니다.
from django.db import models
class User(models.Model):
# ...
date_joined = models.DateTimeField()
users = User.objects.all().order_by('date_joined')
users = User.objects.all().order_by('-date_joined')
예제 3: User
모델의 last_name
및 first_name
필드 기준으로 사용자를 정렬합니다.
users = User.objects.all().order_by('last_name', 'first_name')
예제 4: Article
모델의 publication_date
필드 기준으로 게시물을 오름차순으로 정렬하고, title
필드가 동일한 게시물은 slug
필드 기준으로 정렬합니다.
from django.db import models
class Article(models.Model):
# ...
publication_date = models.DateTimeField()
title = models.CharField(max_length=255)
slug = models.SlugField()
articles = Article.objects.all().order_by('publication_date', 'title', 'slug')
예제 5: Book
모델의 author
필드 기준으로 책을 정렬하고, author
가 동일한 책은 title
필드 기준으로 정렬합니다.
from django.db import models
class Author(models.Model):
# ...
name = models.CharField(max_length=255)
class Book(models.Model):
# ...
author = models.ForeignKey(Author, on_delete=models.CASCADE)
title = models.CharField(max_length=255)
books = Book.objects.all().select_related('author').order_by('author__name', 'title')
위 예제들은 order_by
함수의 다양한 사용 방법을 보여줍니다. 쿼리 세트를 정렬하는 방법에 대한 자세한 내용은 Django 쿼리 API 문서를 참조하십시오.
참고:
- 위 예제 코드는 Django 모델 정의를 포함하지 않습니다. 이 코드는 예시 목적으로만 제공됩니다.
- 실제 코드에서는 사용 중인 모델 및 데이터베이스 스키마에 맞게 코드를 조정해야 합니다.
Django에서 쿼리 세트 정렬하기: 대체 방법
annotate 및 values 함수 사용
annotate
및 values
함수를 사용하여 쿼리 세트에서 계산된 필드를 만들고, 해당 필드를 기준으로 정렬할 수 있습니다. 예를 들어, User
모델의 date_joined
필드 기준으로 사용자를 정렬하려면 다음 코드를 사용할 수 있습니다.
from django.db.models import F
users = User.objects.all().annotate(days_since_joined=F('date_joined') - datetime.datetime.now()).order_by('days_since_joined')
위 코드는 days_since_joined
라는 계산된 필드를 만들고, 해당 필드를 기준으로 사용자를 정렬합니다.
서브쿼리 사용
서브쿼리를 사용하여 쿼리 세트를 정렬할 수도 있습니다. 예를 들어, User
모델의 date_joined
필드 기준으로 사용자를 정렬하려면 다음 코드를 사용할 수 있습니다.
from django.db.models import Subquery
users = User.objects.all().order_by(Subquery(User.objects.filter(pk=F('id')).values('date_joined')))
위 코드는 현재 사용자와 동일한 id
를 가진 사용자의 date_joined
필드 값을 사용하여 쿼리 세트를 정렬합니다.
커스텀 쿼리 사용
더 복잡한 정렬 조건이 필요한 경우 커스텀 SQL 쿼리를 사용할 수 있습니다. Django는 raw
함수를 사용하여 원시 SQL 쿼리를 실행할 수 있도록 합니다. 예를 들어, User
모델의 last_name
및 first_name
필드 기준으로 사용자를 정렬하려면 다음 코드를 사용할 수 있습니다.
from django.db import connection
users = User.objects.raw('SELECT * FROM auth_user ORDER BY last_name, first_name')
- 위 대체 방법들은
order_by
함수보다 더 복잡하고 성능이 저하될 수 있습니다. - 대부분의 경우
order_by
함수를 사용하는 것이 가장 간단하고 효율적인 방법입니다. - 커스텀 SQL 쿼리를 사용하기 전에 Django ORM을 사용하는 것이 더 좋은 방법인지 확인하십시오.
python django sorting