[ 06/21 TIL ] Serializer 심화

JoonQpa·2022년 6월 21일
1

TIL

목록 보기
20/27
post-thumbnail

Serializer 심화

📌validation


def post(self, request):
    user = request.user
    request.data['user'] = user.id # user.id를 추가해주기
    article_serializer = ArticleSerializer(data=request.data)
    

    if article_serializer.is_valid(): #True or False
        article_serializer.save()
        return Response(article_serilizer.data, status=status.HTTP_200_OK)

    return Response(article_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

📌NOT NULL constraint failed: blog_article.user_id

blog_article.user_id는 NOT NULL 제약이 failed했다.

즉 blog_article.user_id가 Null값인 것을 허용할 수 없기 떄문에 발생하는 에러.

blog_article.user_id의 속성에 null=True 추가하여 Null값을 허용할 수 있게 바꿔주거나,

Serializerfieldblog_article.user_id를 추가해주어 에러를 해결할 수 있다.

📌저장하고 싶은 필드와 보내고 싶은 필드가 다르면 시리얼라이저를 따로 만들어 줘야 하나요?

  1. 불러오고 싶지 않은 속성에 write_only=True, readu_only=True를 주어 사용하는 데이터에 차이를 주기

  2. 복잡한 경우 writeSerializer를 따로만들어서 관리해준다.

📌field required.

Serializer feilds에서 지정해준 데이터를 다룰 필요가 없는데, 값이 없다고 오류를 뱉는경우,

user_serializer = UserSerializer(user, data=request.data, partial=True)

partial=True를 추가해서 데이터를 일부분만 받아도 가능한로 해결해 볼 수 있다.

📌custom validate를 http method따라 다르게 설정하고 싶을떄

# serializers.py
user_serializer = UserSerializer(request.user, context = {"request": request}).data

# views.py
try:
    http_method = self.context.get("request", {}).method # POST

except:
    http_method = ''

if http_method == "POST":

📌valid email 리스트 뽑기


valid_email_list = ["naver.com","gmail.com"]

print(data.get("email","").split("@"[-1])) # naver.com

if no data.get("email","").split("@")[-1] not in valid_email_list:
    raise serializers.ValidationError(
        detail={"error": "유효 한 이메일 주소가 아닙니다."}
    )

# 이렇게 코드를 짜면 validate를 실행할때마다 돌아가기 때문에 valid_email_list를 글로벌 함수로 빼서 쓰는게 더 효율적이다. 왜냐면 이메일 리스트는 상수이기때문에(변하지않기떄문에)
VALID_EMAIL_LIST

📌Django Queryset 합치기

queryset1.union(queryset2)
profile
Intuition factory: from noob to pro

0개의 댓글