Backend/Django

[Django] Validator로 유효성 검사하기

keyhong-DE 2023. 11. 18. 23:46

Validators

django.core 모듈에서 제공하는 유효성 검사기이다. API를 만들다보면 Request 값에 대한 유효성 검사를 하거나, 데이터베이스에 데이터를 에러 없이 적재하기 위해 값의 타입 또는 값의 범위를 검사해야 하는 경우는 거의 필수적이다. 최근 typescript를 이용하는 NestJS의 validator를 사용해봤는 데, 개인적으로는 파이썬의 validator가 훨씬 더 깔끔하고 간결하다는 생각이 들었다. (그 이유는 NestJS가 제공하는 Validator는 데코레이터를 이용하는 데, 유효성 검사의 기준이 늘어날 수록 데코레이터 줄의 개수가 늘어나기 때문이다. 반면 파이썬은 model.<Type>Field의 parameter의 리스트로 넣기 때문에 깔끔하다.) 

NestJS의 Validator - 데코레이터 형식
Django의 Validator - Field 클래스의 리스트 파라미터 형식

 

유효성 검사기는 장고에서 제공하는 Built-in validator를 쓸 수도 있고, 사용자가 커스터마이징 해서 쓸 수도 있다. 사용 가능한 목록과 설명은 https://docs.djangoproject.com/en/4.2/ref/validators/ 를 참고하면 된다.

 

이번 포스팅에서는 이전 블로그 포스팅 2023.11.18 - [Backend/Django] - [Django] Django Model 만들기에 이어 추가적인 기능 구현을 하고자 한다.

models.<Type>Field

models.CharField(), models.IntegerField(), models.BooleanField() .. Filed 객체는 django.core.validators에서 제공하는 유효성 검사기는 아니다. 하지만 유효성 검사란 기본적으로 type에 대한 검사가 기본이기에 어떤 Field를 사용하느냐에 따라 타입 검사가 가능하다.

 

또한 일부 Field 객체에서는 특정 파라미터로 값을 받을 수 있다. 그 값 또한 유효성 검사를 위한 추가적인 파라미터이다. 예를 들자면 models.CharField(max_length=?)가 있다. max_length를 설정함으로써 문자열 값의 최대 길이를 제한한다.

from django.db import models

title = models.CharField(max_length=50)

from django.core.validators import *

Field 객체에는 Optional 하게 넣을 수 있는 validators 파라미터를 가지고 있다. 여기에 리스트([validator1, validator2..]) 형식으로 validator 객체를 넣을 수 있다. Built-in validator 객체는 django.core.validators 모듈에 있다. 아래 코드에서 IntergerField의 값의 범위를 제한하기 위해 MinValueValidator(), MaxValueValidator()를 사용하였다. 각 Validator 객체에 값을 넣어 초기화해주고 이를 validators=[ MinValueValidator(1), MaxValueValidator(5) ] 로 인자를 넣었다. 이처럼 유효성 검사가 많아져도 리스트를 통해 깔끔하게 구현 할 수 있다.

from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator

# Create your models here.

class Book(models.Model):
    title = models.CharField(max_length=50)
    rating = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(5)])

    def __str__(self):
        return f"{self.title} ({self.rating})"