Today I Drew
By default, datetime
object is naive
in Python.
즉, datetime
object는 naive
형태와 aware
형태가 있다.
naive
dateime 이란?
: 시간대를 포함하고 있지 않은 시간. 즉, 시간만 봐서는 어느 나라, 혹은 일광 절약 시간 정책과 같은 시간대 정보가 없어 시간대에 대한 암묵적인 정보가 있지 않은 이상은 모호한 정보가 된다.
aware
datetime 이란?
: 시간대를 포함하고 있는 시간. 즉, tzinfo=<UTC>
와 같이 시간대 정보를 시간 정보 마지막에 포함하고 있기때문에, 어떤 시간대를 기준으로 하는 시간인지 알 수 있다.
따라서, 두 시간을 비교하라는 명령을 내리면 해당 오류를 뱉는 것!
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)
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을 시간 데이터로 바꿔줄 수 있다.
시간 데이터를 데이터베이스에 넣을때 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.py
로 request.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을 통과할 수 있다.
느리면 느린대로, 포기하지않고 이해할때까지 무지성 헤딩했던 순간들 때문인지
이젠 에러들이 무섭지가 않다 :)
나름 잘 하고 있었던 것 같다는 생각이 들어 뿌듯했다.
역시 내가 노력하면 못하는게 없는게 맞다 🤪
인스타에서 작품하시는 곳좀 알려주세여 팔로하게요