일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 알고리즘
- 장고
- MAC
- Algorithm
- Git
- CSS
- js
- c++
- form
- API
- 알고리즘 연습
- django widget
- react
- 파이썬 알고리즘
- es6
- 파이썬
- AWS
- DRF
- PYTHON
- Baekjoon
- 알고리즘 문제
- 알고리즘 풀이
- java
- javascript
- 백준
- django ORM
- django rest framework
- web
- HTML
- Django
Archives
- Today
- Total
수학과의 좌충우돌 프로그래밍
[Django] ORM Cookbook, 조회 결과를 정렬하는 방법 본문
해당 포스팅은 Django ORM CookBook 을 공부하며 새로 알게된 사실이나 더 나아가 추가적으로 같이 알면 좋을 내용을 정리하고 있습니다.
1. QuerySet 정렬
Django에서는 order_by
메서드를 사용하여 QuerySet을 정렬할 수 있습니다.
여러 필드에 대해서도 가능하며 -
를 사용하여 내림차순으로 정렬도 가능합니다.
Post.objects.all().order_by('created_at', '-updated_at')
SELECT `post_post`.`id`, `post_post`.`user_id`, `post_post`.`title`, `post_post`.`content`, `post_post`.`created_at`, `post_post`.`updated_at`
FROM `post_post`
ORDER BY `post_post`.`created_at` ASC,
`post_post`.`updated_at` DESC
2. 대소문자에 대한 정렬
order_by
메서드로 쿼리셋을 정렬할 때 텍스트 필드를 기준으로 하면 알파벳의 대, 소문자를 구분하여 정렬이 수행됩니다.
대문자는 소문자보다 우선 순위가 높습니다.
대소문자를 구별하지 않고 구별하기 위해 Lower
함수를 사용할 수 있습니다.
아래에 두 가지 방법이 있습니다.
# 방법 1
from django.models.functions import Lower
User.objects.all().order_by(Lower('nickname')).values_list('nickname', flat=True)
SELECT `accounts_user`.`nickname` FROM `accounts_user` ORDER BY LOWER(`accounts_user`.`nickname`) ASC
# 방법 2
User.objects.annotate(
lower_nickname=Lower('nickname')
).order_by('lower_nickname').values_list('nickname', flat=True)
SELECT `accounts_user`.`nickname` FROM `accounts_user` ORDER BY LOWER(`accounts_user`.`nickname`) ASC
두 방법 모두 쿼리는 동일합니다.
3. 외래 키로 연결된 다른 테이블의 열을 기준으로 정렬
다음과 같이 두 개의 테이블이 있을 때 다른 테이블의 열을 기준으로 정렬하는 법을 알아봅시다.
class User(models.Model):
nickname = models.CharField(max_length=30, unique=True)
class Post(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
title = models.CharField(max_length=50)
__
을 이용해서 연결된 모델의 필드를 가르킬 수 있습니다.
Post.objects.all().order_by('user__nickname', 'title')
SELECT `post_post`.`id`, `post_post`.`user_id`, `post_post`.`title`, `post_post`.`content`, `post_post`.`created_at`, `post_post`.`updated_at`
FROM `post_post`
INNER JOIN `accounts_user`
ON (`post_post`.`user_id` = `accounts_user`.`id`)
ORDER BY `accounts_user`.`nickname` ASC,
`post_post`.`title` ASC
4. 계산된 필드를 기준으로 정렬
위 3. 외래 키로 연결된 다른 테이블의 열을 기준으로 정렬
와 같은 모델이 존재합니다.
이 때 User를 이와 연결된 Post의 수를 기준으로 정렬할 수 있습니다.
User.objects.annotate(post_count=Count('post')).order_by('post_count')
SELECT `accounts_user`.`id`, `accounts_user`.`password`, `accounts_user`.`email`, `accounts_user`.`nickname`, COUNT(`post_post`.`id`) AS `post_count`
FROM `accounts_user`
LEFT OUTER JOIN `post_post`
ON (`accounts_user`.`id` = `post_post`.`user_id`)
GROUP BY `accounts_user`.`id`
ORDER BY `post_count` ASC
'웹프로그래밍 > Django' 카테고리의 다른 글
[Django] ORM CookBook, ORM 코드를 테스트하는 방법 (0) | 2020.08.28 |
---|---|
[Django] ORM Cookbook, 모델을 정의하는 방법 (0) | 2020.08.28 |
[Django] ORM Cookbook, 항목을 생성·갱신·삭제하는 방법 (0) | 2020.08.27 |
[Django] ORM Cookbook, 정보를 조회하고 필요한 항목을 선별하는 방법(3) (0) | 2020.08.27 |
[Django] ORM Cookbook, 정보를 조회하고 필요한 항목을 선별하는 방법(2) (0) | 2020.08.27 |
Comments