• 쿼리셋을 오름차순/내림차순으로 정렬
>>> 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"
    )
    


출처

https://django-orm-cookbook-ko.readthedocs.io/en/latest