티스토리 뷰
반응형
보통 문자열 숫자를 정렬한다고 하면 ..
["60", "20", "0", "120", "0", "80"]
위와 같이 문자열로 이루어져있는 숫자들이 있다고 가정해보자.
별 다를 것 없이 정렬한다면 어떤 결과가 나올까?
실제 결과는 아래와 같다.
['0', '0', '120', '20', '60', '80']
0 다음에 120이 바로 나오게 된다. 왜냐하면 너무 당연하게도 앞문자열에 따라 120의 1이 20보다 빠르기 때문이다.
실제 나는 정렬하려고 하는 기준 데이터들은 다음과 같았다.
<MatchQuerySet [('BAD_WEATHER_20',), ('BAD_WEATHER_40',), ('BAD_WEATHER_60',), ('BAD_WEATHER_80',), ('BAD_WEATHER_60',), ('BAD_WEATHER_60',), ('BAD_WEATHER_60',), ('BAD_WEATHER_120',), ('BAD_WEATHER_40',)]>
해당 필드는 문자열이고 문자 + 숫자가 함께 저장되어있는 필드였다.
우선, BAD_WEATHER_ 이라는 문자열은 모두 공통이므로
from django.db.models.functions import Substr
Substr을 활용해서 값을 분리하여 뒤에 있는 숫자 문자열만 분리하도록 한다.
잘린 문자열 숫자들을 Int로 캐스팅한 뒤, 새로운 필드(num_from_string)을 만들어주도록 한다.
이 후 에는 위에서 만들어준 새로운 필드를 사용해서 정렬하도록 한다!
최종 ORM은 아래와 같았다.
from django.db.models import IntegerField
from django.db.models.functions import Cast, Substr
result_queryset = queryset.annotate(
num_from_string=Cast(Substr("manager_weather", 13), IntegerField())
).order_by("num_from_string")
return result_queryset
- 정렬된 해당 문자열 필드에 대한 실제 값
print(result_queryset.values_list("manager_weather"))
<MatchQuerySet [('BAD_WEATHER_20',), ('BAD_WEATHER_40',), ('BAD_WEATHER_40',), ('BAD_WEATHER_60',), ('BAD_WEATHER_60',), ('BAD_WEATHER_60',), ('BAD_WEATHER_60',), ('BAD_WEATHER_80',), ('BAD_WEATHER_120',)]>
- 실행 결과
print(result_queryset.values_list("num_from_string"))
<MatchQuerySet [(20,), (40,), (40,), (60,), (60,), (60,), (60,), (80,), (120,)]>
반응형
'🌈 프로그래밍 > Django' 카테고리의 다른 글
[ Django ] select_related()와 prefetch_related() (0) | 2023.02.20 |
---|---|
Django Session Cookie Age 알아보고 커스텀하기 (0) | 2023.02.20 |
[ django ] AWS lambda raw sql 에서 django raw sql로 TypeError: not enough arguments for format string 에러 (2) | 2022.11.30 |
[ Django ] SerializerMethodField를 이용한 시리얼라이저 커스텀하기 (0) | 2022.07.21 |
[ Django ] postgresql을 사용할 때 migration 관련 오류 (0) | 2022.04.24 |
04-14 18:35
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 알고리즘
- 전문가를위한C++
- 빅분기
- 회고
- typeORM
- 프로그래머스
- vector
- 백준
- C++
- 문자열
- 일상
- 동적스트링
- GIT
- MFC
- 일차원배열
- TypeScript
- config
- c++17
- programmers
- Python
- BOJ
- 삽질
- django
- 빅데이터처리기사
- 티스토리챌린지
- nest
- 오블완
- 코드업
- 배열
- nestjs
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함