ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] Rest 프레임워크로 [POST] API 만들기 (feat. api_view, serializer)
    파이썬/Django 2023. 1. 9. 18:08
    728x90
    반응형

    새 카테고리 만드는 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
Designed by Tistory.