seminar-2020
seminar-2020 copied to clipboard
POST /api/v1/user/에서 IntegrityError가 발생
#196 Issue, #201 Issue와 동일하게, POST /api/v1/user/를 시도할 때 IntegrityError가 뜨는 문제를 겪고 있습니다.
저는 UserSerializer에서 role을 다음과 같이 정의하고,
role = serializers.ChoiceField(['participant', 'instructor'], read_only=True)
user/serializers.py의 create()에서 role을 확인하고 어떤 값이냐에 따라 해당하는 ParticipantProfile, InstructorProfile을 생성하려고 했습니다. 코드는 다음과 같습니다.

DB에서 auth_user, authtoken_token에 object가 생성이 된 것을 확인했지만, user_participantprofile에는 생성이 되지 않았습니다. #196 이슈에서 제시한대로 auth_user와 authtoken table을 truncate를 해보았지만 문제는 해결되지 않았습니다.

print()를 써서 확인해본 결과, ParticipantProfile.objects.create(user=user) 이후에는 실행이 안 되는 것으로 보이는데, 어떤 부분이 문제인지 잘 모르겠습니다. objects.create()는 object를 생성하고 저장하는 메소드인 것으로 알고 있습니다. 과제를 두 차례 정도 처음부터 갈아엎었으나 문제를 해결하지 못했습니다 ㅠㅠ 어떻게 하면 이 문제를 해결할 수 있을까요?
+추가 질문 이것저것:
-
위 코드에서 hasattr을 통해 university 값 등이 존재하는지 확인하는 것보다 더 나은 방법이 있는지 궁금합니다.
-
context에 대해 아직 잘 이해가 가지 않습니다. 제가 찾은 이 documentation에서 간략한 설명이 나와있었지만 이해가 완전히 되지는 않았습니다. 혹시 제가 찾지 못한 context에 관한 documentation이 있으면 알려주실 수 있나요?
-
UserSerializer에서 validated_data를 프린트할 경우, 다음과 같이
{'username': '24', 'email': '[email protected]', 'password': 'pbkdf2_sha256$216000$vpa0zEcgvhBE$ywY4o2zJLPrMjiWEmjBd+Hy2MBv4RCXgWY1btyPF9EM='}
새로 정의된 다른 field들의 정보는 없고 username, email, password에 대한 정보만 있었습니다. REST documentation에서는 validated_data.pop()을 이용하여 정보를 가져오는 것 같던데, 어떻게 해야 validated_data에서 다른 field에 대한 정보들도 접근할 수 있을까요?
IntegrityError는 데이터베이스와 관련있는 에러입니다. ParticipantProfile model을 어떻게 정의하셨나요?
한편, validated_data는 serializer의 field만을 포함합니다. 따라서 university를 확인하기 위해서는 serializer에 university라는 추가적인 field를 정의해야 합니다.
ParticipantProfile model은 다음과 같이 정의했습니다.

그리고 validated_data에 대해서 설명해주셔서 감사합니다. 다만 추가적인 질문이 있는데,

UserSerializer에서 위와 같이 "university" 등의 field들이 정의되어 있는데도 불구하고 validated_data를 프린트하면 username, email, password에 대한 정보만 나오는 이유는 무엇인가요? print(validated_data.pop('university'))를 시도하면 KeyError: 'university'라는 오류가 뜨네요 ㅠㅠ
ParticipantProfile은 잘 정의된 것 같은데, IntegrityError의 원인은 잘 모르겠습니다..
Debug Toolbar를 이용해서 어떤 SQL query가 보내지는지 확인해보는 것은 어떨까요?
university field가 read_only=True로 설정되어 있습니다. read_only인 경우에는 serialize할 때만 필드가 사용되고, update나 create를 위해 deserialize할 때는 사용되지 않습니다.
이 경우에는 write_only=True로 설정하는 게 적절해 보입니다.
네, Debug Toolbar를 이용해 SQL query를 확인해보겠습니다. 조언 주셔서 감사합니다. university의 경우도 지적해주신 사항대로 고쳤습니다.