본문 바로가기

개발일지/TIL

TIL-23-05-09 drf 팀 프로젝트 - validation

1.drf 팀 프로젝트 - validation

 문제점

유저 회원가입을 만드는 중, 나이 제한의 필요성이 생김

시도해 본 것들

view에서 if문을 통해 검증하기 

class UserView(APIView):
    def post(self, request):
        serializer = UserSerializer(data=request.data)
        try:
            # request.data에서 'age'를 key로 value찾기 
            age = request.data['age']
        except KeyError:
            return Response({"message":"나이를 입력해주세요."}, status=status.HTTP_400_BAD_REQUEST)
        if serializer.is_valid():
            # value로 미성년자 if문 설정
            if age >= 20:
                serializer.save()
                return Response({"message":"가입완료!"}, status=status.HTTP_201_CREATED)
            else:
                return Response({"message":"미성년자입니다."}, status=status.HTTP_406_NOT_ACCEPTABLE)
        else:
            return Response({"message":f"${serializer.errors}"}, status=status.HTTP_400_BAD_REQUEST)

print(request.data)로 age가 제대로 담기는 것을 확인

request.data['age']를 통해서 age 특정하기 

try, except로 age가 없는 경우 예외처리 

 

is_valid() 이후에 if문을 통해서 age 확인하기 

view에서 가능할 것 같아서 이렇게 작성을 했는데 생각보다 너무 많은 분기가 생기면서 코드의 양이 크게 늘어난다. 

 

model에서 해결하기 

from django.core.validators import MinValueValidator, # MaxValueValidator
age = models.PositiveIntegerField('나이', validators=[MinValueValidator(20)])

# validators=[MinValueValidator(0),MaxValueValidator(5)])

나이 제한과 관련된 내용은 코드가 구현이 되어있으리라 생각해서 찾아본 결과 MinValueValidator라는 모듈이 존재했다. 

이걸 넣는 순간 바로 처리가 가능해졌다. 

 해결 방법

from django.core.validators import MinValueValidator
age = models.PositiveIntegerField('나이', validators=[MinValueValidator(20)])

 알게 된 점

있을 법한 기능을 구현한다면 이미 만들어진 코드가 있을 가능성이 높으므로 stackoverflow나 공식문서를 잘 살펴보자 

 

2. python 문법 - dictionary comprehension

 문제점

python 문법 공부 중 list말고 dictionary도 comprehension이 가능함을 알게 됐다. 

 시도해 본 것들

for문을 통한 방법

d = {'a': 8, 'b': 33, 'c': 15, 'd': 26, 'e': 12, 'f': 120, 'g':86}
dict1 = {}
for dicts in d.keys():
    if d[dicts] >= 33:
        dict1[dicts] = d[dicts]
print(dict1)

 

dictionary comprehension 사용 

dict2 = {k: v for k, v in d.items() if v >= 33}
print(dict2)

 

{} 대신 dict()사용

print(dict((k, v) for k, v in d.items() if v >= 33))

 

filter와 lambda 사용

dict3 = dict(filter(lambda v: v[1] >= 33, d.items()))
print(dict3)

 

dict 대신 list로 확인

dict3 = list(filter(lambda v: v[1] >= 33, d.items())) # list 바꾸고 확인
print(dict3)

 알게 된 점

list comprehension 말고 dictionary comprehension도 사용이 가능함을 배웠다.

아직 바로 작성하는데 어려움을 느끼는 lambda와 filter의 사용법을 재 확인했다.