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)
blog_article.user_id는 NOT NULL 제약이 failed했다.
즉 blog_article.user_id가 Null
값인 것을 허용할 수 없기 떄문에 발생하는 에러.
blog_article.user_id의 속성에 null=True
추가하여 Null
값을 허용할 수 있게 바꿔주거나,
Serializer
의 field
에 blog_article.user_id
를 추가해주어 에러를 해결할 수 있다.
불러오고 싶지 않은 속성에 write_only=True
, readu_only=True
를 주어 사용하는 데이터에 차이를 주기
복잡한 경우 writeSerializer
를 따로만들어서 관리해준다.
Serializer feilds에서 지정해준 데이터를 다룰 필요가 없는데, 값이 없다고 오류를 뱉는경우,
user_serializer = UserSerializer(user, data=request.data, partial=True)
partial=True
를 추가해서 데이터를 일부분만 받아도 가능한로 해결해 볼 수 있다.
# 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_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
queryset1.union(queryset2)