-
[Django] Rest 프레임워크로 [POST] API 만들기 (feat. api_view, serializer)파이썬/Django 2023. 1. 9. 18:08728x90반응형
새 카테고리 만드는 post api 만들기
POST categories/
@api_view(["GET", "POST"]) def categories(request): # GET 요청일 때 if request.method == "GET": all_categories = Category.objects.all() serializer = CategorySerializer(all_categories, many=True) return Response(serializer.data) # POST 요청일 때 elif request.method == "POST": serializer = CategorySerializer(data=request.data)
유효성 검사하기
📁 categories/serializers.py
class CategorySerializer(serializers.Serializer): pk = serializers.IntegerField(read_only=True) name = serializers.CharField( required=True, max_length=50, ) kind = serializers.ChoiceField( choices=Category.CategoryKindChoices.choices, ) created_at = serializers.DateTimeField(read_only=True) def create(self, validated_data): return Category.objects.create(**validated_data)
- 새 category를 등록할 때 입력한 정보의 유효성 검사를 할때 어떤 검사를 할 지 코드를 serializer 함수에 작성한다.
- pk, created_at 등 직접 입력이 필요없는 부분은 read_only=True 속성을 설정해준다.
serializer = CategorySerializer(data=request.data)
serializer에게 사용자가 보낸 category 데이터를 넘겨준다.
@api_view(["GET", "POST"]) def categories(request): if request.method == "GET": all_categories = Category.objects.all() serializer = CategorySerializer(all_categories, many=True) return Response(serializer.data) elif request.method == "POST": serializer = CategorySerializer(data=request.data) # 새로 등록할 카테고리 정보의 유효성 검사 if serializer.is_valid(): new_category = serializer.save() return Response( CategorySerializer(new_category).data, ) else: return Response(serializer.errors)
새 데이터 save()
categories/serializers.py에 create 함수를 만들어주면 Category.object().create()를 하지 않아도 자동으로 create 가 이루어진다.
def create(self, validated_data): return Category.objects.create(**validated_data)
여기서 **의 기능은?
딕셔너리 형식을 아래처럼 바꿔준다.
{'name': 'Category from DRF', 'kind':'rooms'} name='Category from DRF', kind='rooms'
views.py
serializer = CategorySerializer(data=request.data) # 유효성 검사에 통과할 경우 if serializer.is_valid(): # 새 객체를 생성한다 -> save() new_category = serializer.save() return Response( CategorySerializer(new_category).data, )
1. 데이터베이스에서 넘어오는 Django 객체를 번역할 때
CategorySerializer에 모델의 인스턴스인 category를 첫 번째 인자로 넘겨주면 된다.
예.
@api_view() def category(request, pk): category = Category.objects.get(pk=pk) # serializer에 번역할 카테고리 인스턴스 넘겨주기 serializer = CategorySerializer(category) return Response(serializer.data)
2. user가 보낸 데이터를 번역할 때
는 CategorySerializer에 첫번째 인자로 data=... 라고 작성한다. 데이터(data)를 넘겨주면 되는 것이다.
예.
serializer = CategorySerializer(data=request.data)
전체코드
📁 categories/views.py
from rest_framework.decorators import api_view from rest_framework.response import Response from .models import Category from .serializers import CategorySerializer @api_view(["GET", "POST"]) def categories(request): if request.method == "GET": all_categories = Category.objects.all() serializer = CategorySerializer(all_categories, many=True) return Response(serializer.data) elif request.method == "POST": # user가 넘겨준 데이터 번역하기 serializer = CategorySerializer(data=request.data) if serializer.is_valid(): new_category = serializer.save() return Response( CategorySerializer(new_category).data, ) else: return Response(serializer.errors) @api_view() def category(request, pk): category = Category.objects.get(pk=pk) serializer = CategorySerializer(category) return Response(serializer.data)
옵션에 제약 걸기
입력할 데이터를 원래 있던 모델의 옵션 중 하나로 선택하게 하고 싶을 때는 옵션 제약을 건다.
choices=Category.CategoryKindChoices.choices,
그 전에 사용할 모델을 import 해온다.
from .models import Category
전체코드
📁 categories/serializers.py
from rest_framework import serializers from .models import Category class CategorySerializer(serializers.Serializer): pk = serializers.IntegerField(read_only=True) name = serializers.CharField( required=True, max_length=50, ) kind = serializers.ChoiceField( # 옵션 제약 걸기 choices=Category.CategoryKindChoices.choices, ) created_at = serializers.DateTimeField(read_only=True) def create(self, validated_data): return Category.objects.create(**validated_data)
LIST'파이썬 > Django' 카테고리의 다른 글
[Django] APIView를 이용한 views.py 리팩토링 1 (0) 2023.01.11 [Django] Rest 프레임워크로 [PUT] API 만들기 (feat. api_view, serializer) (0) 2023.01.10 [Django] Rest 프레임워크로 [GET] API 만들기 (feat. api_view, serializer) (0) 2023.01.08 [Django] 어드민 액션 추가하기, 필터 만들기 (0) 2023.01.07 [Django] Template 및 View 구현하기 (0) 2023.01.05