* 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=์ ๊ฐ์ด ์๊ฐ๋ ์ ๋ณด๋ฅผ ์๊ฐ ์ ๋ณด ๋ง์ง๋ง์ ํฌํจํ๊ณ ์๊ธฐ๋๋ฌธ์, ์ด๋ค ์๊ฐ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ์๊ฐ์ธ์ง ์ ์ ์๋ค.
๋ฐ๋ผ์, ๋ ์๊ฐ์ ๋น๊ตํ๋ผ๋ ๋ช ๋ น์ ๋ด๋ฆฌ๋ฉด ํด๋น ์ค๋ฅ๋ฅผ ๋ฑ๋ ๊ฒ!
โญํด๊ฒฐ ๋ฐฉ๋ฒ
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)
2 .ํ ์คํธ๋ก ๋ณํ ํ ๋น๊ตํ๊ธฐ
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์ ์๊ฐ ๋ฐ์ดํฐ๋ก ๋ฐ๊ฟ์ค ์ ์๋ค.
* 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์ ํต๊ณผํ ์ ์๋ค.
drf๊ณผ์ ๋ฅผ ๋ฃ๊ณ ๋งค ๊ฐ์๋ง๋ค ์ฃผ์ด์ง ๊ณผ์ ๋ฅผ ํ๋ฉด์ ๋งจ ์ฒ์์๋ ์ดํด๋ ์๋๊ณ ๋ฌธ์ ๊ฐ ๋ญ ์ํ๋์ง ์กฐ์ฐจ ๋ชจ๋ฅด๊ฒ ์ด์ ๋ง์ด ์ข์ ํ๊ณ ํ๋ค์์๋๋ฐ, ๋ณต์ต์ ๋ง์ด ํ๊ณ ๋๋๊น ์ ์ ์ดํด๊ฐ ๋๊ธฐ ์์ํ๋ฉด์ ๋๋ฆฌ์ง๋ง, ๊ณผ์ ๋ ํ์ด๋๊ฐ๋ ๋ด๊ฐ๋์๋ค. ์์ผ๋ก๋ ๋จ๋ค๋ณด๋ค ์ข ๋๋ฆฌ๋๋ผ๋ ์กฐ๊ธํดํ์ง๋ง๊ณ ์ข์ ํ์ง๋ง๊ณ ๋ฌํฝ์ด์ฒ๋ผ ์กฐ๊ธ์ฉ์ด๋ผ๋ ๋์๊ฐ์
๐ ์์ธํ ์ฝ๋๋ Moonmoo ์ ๊ฒ์ํ์ต๋๋ค
์ด์ฌํ ํ์๋ ๋ชจ์ต ์๋ฆ๋ต๋ค์^^