Django Working Process
이번에 서버 작업을 하면서 느끼게 된 점들을 정리해 보겠습니다. 향후 추가내용이 있으면 계속 추가 해 보겠습니다.
- 크롤링 작업 단위로 별도 함수를 적용한다
- 유효성 검사 작업도 별도 함수를 적용한다. (조건들이 추가되는 경우가 많아서…)
Django Datetime
FastAPI 에 대해서도 점차 정리해 보겠습니다
datetime
객체가 DB 에 저장하고 호출하는 경우, 강제로 UTC (그리니치 천문대 기준 시간대) 로 변환되는 경우를 마주치는데, 2줄 요약하면 다음과 같다
settings.py
에서 USE_TZ = False 정의하기sqlite3
대신 mysql, psql 데이터베이스 사용하기
naive datetime objects
# settings.py
USE_TZ = True
TimeZone
정보가 분리된 datetime
객체를 DataBase 에서 사용 합니다. templates, forms
에서만 TIME_ZONE
이 적용되고, admin.py
등에서 변환된 시간대는 추가 설정 이 필요 합니다.
# admin.py
class Model(models.Model):
datetime = models.DateTimeField()
code = models.ForeignKey(Code, on_delete=models.CASCADE)
def __str__(self) -> str:
from django.utils import timezone
time_date = timezone.make_naive(self.datetime)
return str(self.datetime) + " | " + self.code.name
Rest Api 에서 활용하기 위해서도 추가 정의가 필요 합니다.
from pytz import timezone
from django.conf import settings
seoul = timezone(settings.TIME_ZONE)
# <DstTzInfo 'Asia/Seoul' LMT+8:28:00 STD>
item = Model.objects.all()[0].datetime # tzinfo:utc
item.astimezone(seoul) # DstTzInfo:'Asia/Seoul'
import datetime
from django.utils.timezone import now
now().astimezone(seoul) # DstTzInfo:'Asia/Seoul'
datetime.datetime.now().astimezone(seoul) # DstTzInfo 'Asia/Seoul'
now().astimezone(seoul).utcnow() # tzinfo:utc
Django 시간대 설정
# settings.py
USE_TZ = False
위 내용이 문제되는 이유는 sqlite3
에서 시간대를 정의할 수 없기 때문에 위 내용이 문제가 되었던 내용 입니다. 대신 위 설정을 정의하면 DataBase 에서 tz info
를 함께 저장해서 통일된 시간대를 활용할 수 있게 됩니다. 국내 서비스만을 위한 내용은 이 설정을 활용하면 됩니다.