[ 06/22 TIL ] Serializer 심화(2)

JoonQpa·2022년 6월 22일
2

TIL

목록 보기
21/27
post-thumbnail

Today I Drew

📌 TypeError: can't compare offset-naive and offset-aware datetimes

By default, datetime object is naive in Python.

즉, datetime object는 naive형태와 aware형태가 있다.

  • naive dateime 이란?
    : 시간대를 포함하고 있지 않은 시간. 즉, 시간만 봐서는 어느 나라, 혹은 일광 절약 시간 정책과 같은 시간대 정보가 없어 시간대에 대한 암묵적인 정보가 있지 않은 이상은 모호한 정보가 된다.

  • aware datetime 이란?
    : 시간대를 포함하고 있는 시간. 즉, tzinfo=<UTC>와 같이 시간대 정보를 시간 정보 마지막에 포함하고 있기때문에, 어떤 시간대를 기준으로 하는 시간인지 알 수 있다.

따라서, 두 시간을 비교하라는 명령을 내리면 해당 오류를 뱉는 것!

⭐해결방법

  1. pytz 라이브러리를 사용하기.

import datetime
import pytz

utc=pytz.UTC

datetime_start = utc.localize(challenge.datetime_start) 
datetime_end = utc.localize(challenge.datetime_end) 

하지만 만약 tzinfo 값이 이미 설정되어 있으면 ValueError를 뱉을 수 있다. 따라서 확실하지 않으면 아래 방법을 추천한다고 한다.

start_time = datetime_start.replace(tzinfo=utc)
end_time = datetime_end.replace(tzinfo=utc)

  1. 텍스트로 변환 후 비교하기
end_date = data.get("end_date", {})
end_date = end_date.strftime("%Y-%m-%d %H:%M")
today = datetime.today().replace(tzinfo=utc).strftime("%Y-%m-%d %H:%M")

if end_date < today:
	print("True")

위와 같이 텍스트로 변환 후 비교할 수 있다.

혹은 날짜 타입이 필요한 것이라면

time.strptime(datetime_string, %Y-%m-%d %H:%M")

striptime(<텍스트 시간>, <날짜 형식>) 을 사용하여 str을 시간 데이터로 바꿔줄 수 있다.


📌 invalid literal for int() with base 10

시간 데이터를 데이터베이스에 넣을때 microsecond 정보때문에 발생할 수 있는 오류.

db가 담을 수 있는 시간 단위를 microsecond때문에 초과해서 생기는 문제이다.

⭐해결방법

시간뒤에 microsecond 값을 제외해준다.
now.replace()함수를 사용한뒤 db에 저장하면 된다.


import datetime

current = datetime.datetime.now()
print(current)

current_time = current.replace(microsecond=0)
print(current_time)

#
2022-06-22 17:00:07.353545
2022-06-22 17:00:07

📌 serializer.pyrequest.method 정보 보내기

Serializer에 context 인자 값을 넣어 해결할 수 있다.

# views.py
def put(self, request, obj_id):
	product = Product.objects.get(id=obj_id)
	product_serializer = ProductSerializer(product, data=request.data, partial=True, context={"request": request})
    # ProductSerializer(context={"reqeust": request}) 를 이용해서 views.py에서 받은 request 정보를 보내준다.


	if product_serializer.is_valid():
		product_serializer.save()
        return Response(product_serializer.data, status=status.HTTP_200_OK)

	return Response(product_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
    
# serializers.py

# custom validation
def validate(self, data):
	# 가져온 context 값 안에 있는 request 사용
	if self.context['request'].method == 'PUT':
		return data

이렇게 하면 method가 PUT 일때 custom validation을 통과할 수 있다.


느리면 느린대로, 포기하지않고 이해할때까지 무지성 헤딩했던 순간들 때문인지

이젠 에러들이 무섭지가 않다 :)

나름 잘 하고 있었던 것 같다는 생각이 들어 뿌듯했다.

역시 내가 노력하면 못하는게 없는게 맞다 🤪

profile
Intuition factory: from noob to pro

2개의 댓글

comment-user-thumbnail
2022년 6월 22일

인스타에서 작품하시는 곳좀 알려주세여 팔로하게요

1개의 답글