๐Ÿ“’ [ TIL ] 2022.06.24_47์ผ์ฐจ # Django Rest Framework (7)

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

[ 2022-06-24 (๊ธˆ) ์˜ค๋Š˜์˜ TIL ]

[ Today Learn ]

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

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

* custom validate๋ฅผ http method๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•˜๊ณ  ์‹ถ์„๋•Œ

๐Ÿงฉ ์ ์šฉ ์˜ˆ์‹œ

# serializers.py
user_serializer = UserSerializer(request.user, context = {"request": request}).data

# views.py
try:
    http_method = self.context.get("request", {}).method # POST

except:
    http_method = ''

if http_method == "POST":

* write_only = True, read_only = True

์ €์žฅํ•˜๊ณ  ์‹ถ์€ ํ•„๋“œ์™€ ๋ณด๋‚ด๊ณ  ์‹ถ์€ ํ•„๋“œ๊ฐ€ ๋‹ค๋ฅด๋ฉด ์‹œ๋ฆฌ์–ผ๋ผ์ด์ €๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์ฃผ์ง€ ์•Š์•„๋„ ๋˜๊ณ , ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

  1. ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์‹ถ์ง€ ์•Š์€ ์†์„ฑ์— write_only = True, read_only = True ์†์„ฑ์„ ์ค˜์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ์ฐจ์ด๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  2. ๋ณต์žกํ•œ ๊ฒฝ์šฐ์—๋Š” writeserializer๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ๊ด€๋ฆฌํ•ด์ค€๋‹ค.

* field required ์˜ค๋ฅ˜ํ•ด๊ฒฐ

Serializer feilds์—์„œ ์ง€์ •ํ•ด์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ํ•„์š”๊ฐ€ ์—†๋Š”๋ฐ, ๊ฐ’์ด ์—†๋‹ค๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ฑ‰๋Š”๊ฒฝ์šฐ,

๐Ÿงฉ ์ ์šฉ ์˜ˆ์‹œ

user_serializer = UserSerializer(user, data=request.data, partial=True)

'partial=True' ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๋ถ€๋ถ„๋งŒ ๋ฐ›์•„๋„ ๊ฐ€๋Šฅํ•œ์ฑ„๋กœ ํ•ด๊ฒฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


* read_only / status code

join_date์™€ ๊ฐ™์€ ๊ณ„์ •์ƒ์„ฑ์ผ์ž๋ผ๋˜๊ฐ€ ํ•˜๋Š” ๋ถ€๋ถ„์€ ๊ฐ’์ด ์ž๋™์ ์œผ๋กœ ๊ณ ์ •(auto_now_add=True)๋˜๊ธฐ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•  ์ˆ˜ ์—†์–ด์„œ read only๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.

status code๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์ฒ˜๋ฆฌํ•  ์ž‘์—…์ด ๋‹ฌ๋ผ์ง€๊ธฐ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด status์ž‘์—…์„ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

๐Ÿงฉ ์ ์šฉ ์˜ˆ์‹œ

def get(self, request):
        today = datetime.now()
        products = ProductModel.objects.filter(
        Q(post_start_date__lte=today, post_end_date__gte=today, is_active=True) |
        Q(user=request.user)
        )
        return Response(ProductSerializer(products, many=True).data, status=status.HTTP_200_OK)
    
    def post(self, request):
        request.data['author'] = request.user.id

        product_serializer = ProductSerializer(data=request.data)
        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)

    def put(self, request, obj_id):
        product = ProductModel.objects.get(id=obj_id)

        product_serializer = ProductSerializer(product, data=request.data, partial=True)

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

๐ŸŒฑ ๋Š๋‚€ ์ 

Django ๊ธฐ๋ณธ ๊ฐœ๋…์„ ๋ณต์Šตํ•˜๋Š” ๊ฒƒ์€ ์ด์ „์— ํ•™์Šตํ•œ ๊ฒƒ์„ ๋ฆฌ๋งˆ์ธ๋“œํ•˜๊ณ  ๋ถ€๋ถ„๋ถ€๋ถ„ ๋ถ€์กฑํ–ˆ๋˜ ์ง€์‹์„ ์Œ“์„ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ํ•œ ๋ฒˆ ๊ฐ•์˜ ๋“ฃ๋Š”๋‹ค๊ณ ํ•ด์„œ ๋ฐ”๋กœ ์•Œ์•„๋“ฃ๋Š” ๊ฒƒ์€ ์ฒœ์žฌ๋“ค์—๊ฒŒ๋‚˜ ๊ฐ€๋Šฅํ•œ ์ผ์ด๊ธฐ๋•Œ๋ฌธ์— ๋’ค์ณ์ ธ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋ง๊ณ  ๊พธ์ค€ํ•˜๊ฒŒ ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๐ŸŽ ์ž์„ธํ•œ ์ฝ”๋“œ๋Š” Moonmoo ์— ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค

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

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

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