현제의 현재이야기
[OSOD] Timezone과 연속 학습 본문
이부분의 view이다.
class MypageUserDetailView(APIView):
def get(self, request, *args, **kwargs):
user = self.request.user
posts = Post.objects.filter(user_id = user.id).order_by('-created_at')
post_num = posts.count()
today = datetime.now().date()
today_study_bool = False
continuous_cnt = 0
prev_date = datetime.now().date()
for post in posts:
if post.created_at.date() == today:
today_study_bool = True
if post.created_at.date() == prev_date:
continue
if (prev_date - post.created_at.date()).days > 1:
break
continuous_cnt += 1
prev_date = post.created_at.date()
if today_study_bool:
continuous_cnt += 1
data = {
"post_num" : post_num,
"continuous_cnt": continuous_cnt,
"liked_num": user.liked_num,
"today_study_bool": today_study_bool
}
return Response(data)
- 저 연속학습 알고리즘을 짜보았는데 잘 작동하였댜.
- 만약 post 제일 처음의 날짜가 오늘이라면 today_study_bool(오늘 작문 했는가?) 를 True로 바꿔준다.
- prev_date 때문에 중복된 날짜의 post가 오면 continue로 넘겨준다. 처음 prev_date가 오늘로 되어있기 때문에 today_study_bool을 True로 바꿔준 뒤, continue로 계속 넘어간다.
- 만약 prev_date와 post의 날짜가 1일이상 차이나면 연속되어 학습한게 아니므로 break해준다.
- 그리고 위 if문이 걸리지 않았다면 cnt+1를 해주고 prev_date를 갱신해준다.
- 마지막으로 today_study_bool이 True라면 cnt+1을 해준다.
TImezone에 대하여
- 자꾸 화나게 데이터베이스에 저장되는 created_at과 api에서 보여주는 created_at이 달라서 애먹었다.
- stackoverflow에 검색해보니 USE_TZ를 False로 해야된단다.
settings.py
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
USE_I18N = True
USE_TZ = False
- USE_TZ는 장고의 서버 전체를 지정한 TIME_ZONE으로 설정해주는 거란다.
- 그래서 True로 해두었는데 알고보니 얘 때문에 데이터베이스에 저장되는 시간이 달랐던 것.
- False로 하니깐 현재 서울 시간으로 잘 저장되었다.
좋은 거 알아갑니다.
'DRF > OSOD' 카테고리의 다른 글
[OSOD] Non-serializer (0) | 2023.02.20 |
---|---|
[OSOD] DRF URL 파라미터 추출과 쿼리 파라미터 추출에 대한 고찰 (0) | 2023.02.19 |
[OSOD] 구독 이메일 관련 (0) | 2023.02.19 |
[OSOD] 비밀번호 변경 및 리셋 관련 (0) | 2023.02.16 |
[OSOD] SerializerMethodField()에 대하여 (0) | 2023.02.13 |
Comments