django에서는 모델의 몇몇 Field를 내부적으로 기본 자료형이 아닌 인스턴스로써 저장한다.
대표적으론 다음과 같다.
DateField -> datetime.date
DateTimeField -> datetime.datetime
DateField -> datetime.date
DecimalField -> decimal
때문에 컬럼을 가져올 때 다음과 같이 나온다.
print(TestModel.objects.all().values('testDateField'))
# <QuerySet [{'testDateField' : datetime.date(2022, 1, 9)}, ...]>
client에게 database의 컬럼을 JSON String 형식으로 전달해주고 싶은 경우 이는 걸림돌이 된다.
그래서 model을 override하는 방법을 찾아보았지만 너무 복잡해보였다.
때문에 반복문으로 일일이 처리해주었다.
querySet = TestModel.objects.all().values('testDateField')
for val in querySet:
val['testDateField'] = val['testDateField'].strftime("%Y-%m-%d")
print(querySet)
# <QuerySet [{'testDateField' : '2022-01-09'}, ...]>
하지만 길이가 얼마가 될 지 모르는 컬럼들을 반복문으로 돌리기엔 찝찝하다.
이를 위해서 집계함수등을 사용할 때 쓰이는 annotate와
형 변환을 위한 Cast를 사용하는 방법이 있다.
from django.db.models.functions import Cast
from django.db.models import TextField
querySet = TestModel.objects.all().annotate(
strDate = Cast('testDateField',TextField())
)
print(querySet.values('strDate'))# testDateField가 지워지는게 아닌 strDate가 추가되는 것.
# <QuerySet [{'strDate' : '2022-01-09'}, ...]>
extra를 이용할 수도 있지만 공식 문서에서는 권고하고 있지 않다.