django SET_NULL 옵션과 시리얼라이저 저장, 그리고 테스트코드 immutable QueryDict
# 변경 전 코드
class QnAAnswer(models.Model):
user = models.ForeignKey(UserModel, verbose_name="답변자", on_delete=models.CASCADE)
question = models.ForeignKey(QnAQuestion, verbose_name="질문", on_delete=models.CASCADE)
content = models.TextField("답변")
like = models.ManyToManyField('user.User', related_name="answer_like", through="AnswerLike")
is_selected = models.BooleanField("채택여부")
# 변경 전 코드
class AnswerView(APIView):
def post(self, request, question_id):
target_question = QnAQuestionModel.objects.get(id=question_id)
request.data['is_selected'] = False
request.data['user'] = request.user.id
request.data['question'] = target_question.id
answer_serializer = AnswerSerializer(data=request.data)
if answer_serializer.is_valid():
answer_serializer.save(**after_valid_datas)
return Response({"message": "답변 작성 고맙거북"}, status=status.HTTP_200_OK)
else:
print(answer_serializer.errors)
return Response({"message": "답변 작성 실패거북"}, status=status.HTTP_400_BAD_REQUEST)
QueryDict is Immutable
이라는 것만 계속 뱉을 뿐이다…is_valid()
함수를 통해서 반드시 데이터 검증을 거쳐야 한다
. 모델에서 작성한 대로 형식은 맞는지, 제대로 들어왔는지 검증을 지나고 나서 데이터를 저장, 수정, 출력할 수 있게 된다.입력받은 데이터 이외의 정보는 따로 검증을 통과하고 저장할 수 밖에 없다
.on_delete=CASCADE
라는 옵션이 있다. 이건 참조하는 키의 레코드가 삭제되면 지금 작성하려는 데이터도 자동으로 삭제하는 옵션
인데, 이걸 하려면 데이터가 반드시 들어있어야 한다.입력받은 데이터 이외에는 수정해줄 수가 없기 때문
에, 검증에서 자꾸 실패하는 것이다. 필수로 받아야 하는 필드가 없으니까SET_NULL
로