django, drf

timezone설정이 일부 datetime_field에만 적용되는 이슈 해결방법

땅콩콩 2022. 11. 17. 14:01

우선 db는 post모델과 advertisement모델을 1:1로 연결해서 글을 생성하는 구조로 되어있다.

그리고 각 모델의 코드는 아래와 같다.

 

 - post/models/post.py

class Post(models.Model):
    """Model definition for Post."""

    class Meta:
        db_table = 'posts'
        verbose_name = 'Post'
        verbose_name_plural = 'Posts'

    POST_TYPE = (
        ('R', 'review'),
        ('C', 'clubpost'),
        ('A', 'advertisement'),
    )

    title = models.CharField(
        max_length=20,
        null=False,
        verbose_name='제목'
    )
    content = models.TextField(
        max_length=2000,
        null=False,
        verbose_name='내용'
    )
    author = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        null=False,
        verbose_name='글쓴이',
    )
    type = models.CharField(
        max_length=1,
        choices=POST_TYPE,
        null=True,
        verbose_name='글 종류',
    )
    created_at = models.DateTimeField(
        auto_now_add=True,
        verbose_name='생성 일시',
    )
    updated_at = models.DateTimeField(
        auto_now=True,
        verbose_name='수정 일시',
    )

- ad/models/advertisement.py

from django.db import models
from post.models import Post


class Advertisement(models.Model):
    class Meta:
        db_table = 'advertisements'
        verbose_name = 'Advertisement'
        verbose_name_plural = 'Advertisements'

    post = models.OneToOneField(
        Post,
        on_delete=models.CASCADE,
        related_name='advertisement',
    )
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()

 

코드에서 보이다시피 post모델에는 created_at, updated_at이라는 DateTimeField가 있고, advertisement모델에는 start_date, end_date이라는 DateTimeField가 있다.

 

 

그리고 settings.py에서 timezone을 우리나라 기준시에 맞게 설정해주었다.

TIME_ZONE = "Asia/Seoul"

settings.py에서의 timezone 설정은 프로젝트 전체에 영향을 미친다고 생각했기 때문에 원하는 시나리오는 Advertisement 객체를 생성할 때 Post객체의 필드로 있는 created_at, updated_at 과 더불어 advertisement의 필드인 start_date, end_date까지 Asia/Seoul timezone으로 잘 저장되는 것이다.

 

하지만 테스트를 해보면 post의  created_at, updated_at만 정상적으로 현재 한국시간이 저장되고, advertisement의 start_date, end_date에는 반나절 뒤 시간이 저장되는 이슈를 확인할 수 있었다.

 

그리고 해당 이슈의 해결법은 공식문서에 나와있었다.

https://docs.djangoproject.com/el/3.1/ref/settings/#std:setting-TIME_ZONE

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

USE_TZ=True이면, 내가 설정해준 TIME_ZONE이 장고에서 제공하는 template이나 form에만 부분적으로 적용되는 것이고 ( post의 필드들은 autonow나 autonowadd 필드여서 timezone이 정상적으로 사용된것!),

USE_TZ=False이면, 내가 설정해준 TIME_ZONE이 프로젝트 전체에 적용된다!

 

 

따라서 해당 설정을 변경해주었다.

USE_TZ = False

그러고나니 해당 이슈가 정상적으로 해결된 걸 확인할 수 있었다!