본문 바로가기
파이썬(Python)/장고(Django)

[기초] 파이썬 장고 REST API 프레임워크 - Validation

by 기계공학 주인장 2024. 2. 2.
반응형

이번 포스팅에서는 파이썬의 장고 REST API 프레임워크를 사용하여 유효성 검사(Validation)를 하는 방법에 대해 알려드리겠습니다.

 

장고 REST API 프레임워크에는 다음과 같은 유효성 검사가 있습니다.

  • Field-Level Validation
  • Object-Level Validation
  • Core Argument

장고 REST API 프레임워크의 Field-Level Validation

Field-Level Validation이라는 것은 직접 정의한 Serializer 클래스에서 특정 영역(Field)만 

 

유효성 검사를 실시하는 것을 의미합니다.

 

이전 포스팅에서 MovieSerializer라는 클래스를 생성했습니다.

 

https://android-developer.tistory.com/80

 

파이썬 Django REST API 프레임 워크 사용하기 - 기초편

이전 포스팅에서는 파이썬의 Django을 설치하는 방법과 기본적인 원리를 설명했습니다. 이번 포스팅에서도 이어서 하기 때문에 아래의 포스팅을 먼저 보는 것을 추천합니다. 파이썬 Django를 사용

android-developer.tistory.com

 

해당 클래스 내에서 name이라는 Field만 유효성을 검사하고 싶다면 다음과 같은 방법으로 할 수 있습니다.

 

 

# api/serializers.py

from rest_framework import serializers
from watchlist_app.models import Movie

class MovieSerializer(serializers.Serializer):
    # 각 변수별로 serialize한 데이터를 받는다.
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField()
    description = serializers.CharField()
    active = serializers.BooleanField()
    
    def create(self, validated_data):
        return Movie.objects.create(**validated_data)
    
    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        instance.description = validated_data.get('description', instance.description)
        instance.active = validated_data.get('active', instance.active)
        instance.save()
        return instance
    
    # field level validation
    # validate_필드 이름으로 만들면 자동으로 오버라이드 해준다.
    def validate_name(self, value):
        if len(value) < 2:
        	raise serializers.ValidationError("이름이 너무 짧습니다.")
        else :
            return value

 

위 코드와 같이 validate_필드이름으로 함수를 만들면 장고 REST API 프레임워크가 자동으로 해당 함수를

 

해당 필드 이름의 유효성을 확인하는 함수로 인식합니다.

 

그렇기 때문에 특정 코드에서 해당 함수를 사용하지 않아도 자동으로 유효성 검사를 실시합니다.

 

다음과 같이 name에 유효하지 않은 데이터를 넣고 PUT을 하면 다음과 같은 경고를 받습니다.

 

 

특정 필드 하나만 체크하는 것이 아닌 한번에 모든 데이터의 유효성을 검사할 수도 있습니다.

 

다음과 같이 validate라는 함수를 작성합니다.

 

    # api/serializers.py
    
    def validate(self, data):
        if data['name'] == data['description']:
            raise serializers.ValidationError("이름과 내용이 같아선 안됩니다.")
        else:
            return data

 

위와 같이 하면 실제로 모든 데이터가 validate 함수를 한 번 거치게 됩니다.


장고 REST API 프레임워크의 Object-Level Validation


위에서 보여드린 거처럼 "validate_필드이름"으로 함수를 만드는 것이 아니라

 

직접 정의한 함수 이름으로 유효성 검사를 할 수도 있습니다.

 

from rest_framework import serializers
from watchlist_app.models import Movie

# field level validation
# validate_필드 이름으로 만들면 자동으로 오버라이드 해준다.
def name_length(value):
    if len(value) < 2:
        raise serializers.ValidationError("이름이 너무 짧습니다.")
    else :
        return value

class MovieSerializer(serializers.Serializer):
    # 각 변수별로 serialize한 데이터를 받는다.
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(validators=[name_length])
    description = serializers.CharField()
    active = serializers.BooleanField()
    
    
    def create(self, validated_data):
        return Movie.objects.create(**validated_data)
    
    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        instance.description = validated_data.get('description', instance.description)
        instance.active = validated_data.get('active', instance.active)
        instance.save()
        return instance

 

name_length라는 이름의 함수를 만들었고 이를 name field에 직접 validator로 임명해 줍니다.

 

Field-Leval Validation에 대한 공식 문서는 다음 사이트에서 확인할 수 있습니다.

 

https://www.django-rest-framework.org/api-guide/serializers/#field-level-validation

 

Serializers - Django REST framework

 

www.django-rest-framework.org


Field의 Core Argument

id 필드를 보면 읽기만 가능하다는 정의가 되어있습니다.

 

이러한 파라미터를 Core Argument라고 합니다.

 

다른  Core Argument는 아래의 공식 문서에서 확인할 수 있습니다.

 

https://www.django-rest-framework.org/api-guide/fields/#core-arguments

 

Serializer fields - Django REST framework

 

www.django-rest-framework.org

 


이전에 게시한 파이썬 장고 REST API 프레임워크에 대한 포스팅

 

https://android-developer.tistory.com/category/%ED%8C%8C%EC%9D%B4%EC%8D%AC%28Python%29/%EC%9E%A5%EA%B3%A0%28Django%29?page=1

 

'파이썬(Python)/장고(Django)' 카테고리의 글 목록

Git: https://github.com/mmol93

android-developer.tistory.com

 

 

반응형


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


댓글