본문으로 바로가기

Validation 1편 : 어떻게 사용할까?

category TIL/기술 실험, 공부 2022. 11. 30. 23:10
def save(self, force_insert=False, force_update=False, using=None,update_fields=None):
   if self.x > self.y:
       raise BadRequest(details={'message':'x should be less than y.'})
   return super(xx, self).save()
def validate(self, attrs):
    if attrs['x'] > attrs['y']:
       raise BadRequest(details={'message':'x should be less than y.'})
    return attrs 

몇일전 튜터님에게 피드백을 받으면서 Validation에 대해서 알게되고 새로운 프로젝트를 시작하면서 꼭 사용해보고싶어서 자료를 찾아봤다. 현재는 간단하게 모델에서 글자수를 제한하거나 시리얼라이저에서 글자수를 제한하는 단순한 모양의 유효성 검사였다면 앞으로는 더 나가서 프론트와 백엔드에서 적절하게 유효성검사를 진행해서 프론트에서는 사용자들의 경험이 좋아지게해야하고 백엔드 부분에서는 모델과 시리얼라이저에서 validation을 추가해서 db에 직접 유효하지 않은 데이터를 저장하지 않게 해야한다고 생각했다. 그리고 그걸 위해서 validation을 사용해야 하는걸 알게되었다.

stackoverflow에서 검색한 결과 유효성 검사를 모델에 직접 추가하는걸 추천하는 글이 많았다. 이유는 데이터의 출처에 관계없이 항상 유효성이 검사되고 장고 관리자에서도 적용이되는 장점이 있기때문이다.

그리고 장고공식문서를보고 이미 작성한 시리얼라이저에서도 피드백을 받았다.

class TopPostListSerializer(serializers.ModelSerializer):
    user =serializers.SerializerMethodField()
    likes_count = serializers.SerializerMethodField()
    comments_count =serializers.SerializerMethodField()
    created_date= serializers.SerializerMethodField()
# 카운트
# 메소드 필드에 의존하지말라
# 장고 벨리데이터가 있다
# 모델에서 정의를 벨리데이터로 넘어간다. 조건을 검증한다.
# 검증내용을 프론트에서 1차 거른다 비밀번호 조건이라던가 잘못입력한걸 js로 거르면 사용자 경험이 좋아진다. 실제로는 데이터관리 모델 백엔드에서 벨리데션 하면 좋다.
# 시리얼라이저가 가지고있다 기본적으로 벨리데이터 / 커스터마이즈 해서 사용
    def get_user(self, obj):
        if obj.category=='익명게시판':
            post=obj.id
            user=obj.user_id
            random_name=RandomName.objects.get(user_id=user, post_id=post)
            return random_name.name
        else:
            return obj.user.username
    def get_comments_count(self,obj):
        return obj.postcomment_set.count()
    def get_likes_count(self, obj): #카운트 어그리게이트 어노테이트 사용가능 모델에서 조작가능 / 모델에서 카운트를 기록
        return obj.likes.count()
    def get_created_date(self,obj):
        return str(obj.created_date)[:19] # 프론트에서 조작해도 괜찮다. 처음엔 왜 메소드필드 썻는지 모르겠다 하심
    class Meta:
        model = Post
        fields=('title','content','user','likes_count','comments_count','hits','category','id','created_date')