- 쿼리셋을 오름차순/내림차순으로 정렬
>>> User.objects.all().order_by('date_joined') #오름차순
>>> User.objects.all().order_by('-date_joined') #내림차순
>>> User.objects.all().order_by('date_joined', '-last_login') #기준 필드 여러개
- 대소문자 구별하지 않고 정렬
order_by 메서드로 쿼리셋을 정렬할 때, 텍스트 필드를 기준으로 하면 대문자가 소문자 보다 높은 우선순위가 부여된다.
Lower를 사용하여 대소문자를 구별하지 않고 정렬
>>> from django.db.models.functions.import Lower
>>> User.objects.all().order_by(Lower('username')).values_list('username', flat=True)
#annotate 메서드로 Lower 열을 적용하는 방법
User.obejcts.annotate(
lower_name=Lower('username')
).order_by('lower_name').values_list('username', flat=True)
- 외래 키로 연결된 다른 표의 열을 기준으로 정렬
class Category(models.Model):
name = models.CharField(max_length=100)
class Hero(models.Model):
name = models.CharField(max_length=100)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
# Hero 모델의 쿼리셋을 category 필드 순으로 정렬하되, category가 같은 항목은 name 필드 순으로 정렬
Hero.objects.all().order_by('category__name','name')
이중 밑줄 기호로 연결된 모델의 필드를 가리킬 수 있다.
- 계산 필드를 기준으로 정렬
Category.objects.annotate( hero_count=Count("hero") ).order_by( "-hero_count" )
출처