우선 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
USE_TZ=True이면, 내가 설정해준 TIME_ZONE이 장고에서 제공하는 template이나 form에만 부분적으로 적용되는 것이고 ( post의 필드들은 autonow나 autonowadd 필드여서 timezone이 정상적으로 사용된것!),
USE_TZ=False이면, 내가 설정해준 TIME_ZONE이 프로젝트 전체에 적용된다!
따라서 해당 설정을 변경해주었다.
USE_TZ = False
그러고나니 해당 이슈가 정상적으로 해결된 걸 확인할 수 있었다!
'django, drf' 카테고리의 다른 글
drf dj_rest_auth 로그인 커스텀, non_field_error 해결방법 (0) | 2022.11.17 |
---|---|
dj-rest-auth/allauth를 이용한 회원가입기능 구현 (2) | 2022.08.04 |
사용한 라이브러리 관리 (0) | 2022.07.28 |
내가 보려고 쓰는 장고 설치+초기설정 (0) | 2022.04.04 |