๐Ÿ“’ [ TIL ] 2022.06.22_45์ผ์ฐจ # Django Rest Framework (6)

๋ฌธ๋ช…์ฃผยท2022๋…„ 6์›” 22์ผ
0
post-thumbnail

[ 2022-06-22 (์ˆ˜) ์˜ค๋Š˜์˜ TIL ]

[ Today Learn ]

  • drf๊ฐ•์˜๊ฐ€ ๋๋‚˜๊ณ  drf ๋ณต์Šต์ง„ํ–‰

โœ๏ธ ๋‚ด๊ฐ€ ๋ฐฐ์šด๊ฒƒ, ์–ป์€ ๊ฒƒ

* 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 ์— ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค

profile
ํ•˜๋ฃจ ํ•œ๊ฑธ์Œ์”ฉ ๊พธ์ค€ํžˆ ๋‚˜์•„๊ฐ€๋Š” ๊ฐœ๋ฐœ์ž๐Ÿ™†โ€โ™€๏ธ https://github.com/Moonmooj

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2022๋…„ 6์›” 23์ผ

์—ด์‹ฌํžˆ ํ•˜์‹œ๋Š” ๋ชจ์Šต ์•„๋ฆ„๋‹ต๋„ค์š”^^

1๊ฐœ์˜ ๋‹ต๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด