해결된 질문
작성
·
576
답변 5
0
0
말씀해주신대로 serializers.py와 perform create 함수 재정의를 하고 나서
http://127.0.0.1:8000/post/ 에서 위와 같이 나타납니다!
그리고 값을 채운 후 Post 실행 시
아래와 같은 에러가 발생하였습니다.
ValueError: Cannot assign "<django.contrib.auth.models.AnonymousUser object at 0x7f7a81128ee0>": "Post.author" must be a "User" instance.
[22/Jul/2022 02:20:32] "POST /post/ HTTP/1.1" 500 129031
아직 DRF가 처음이라서 에러 메세지를 읽어도 제 코드가 무엇이 잘못되었는지 잘 모르겠네요 ㅠㅠ
HTTPie 를 통한 TEST -> 인증 헤더를 통해 유저 정보를 넘겨주는 것은 아직 이해가 어려워
createsuperuser을 통한 로그인으로 해결하였습니다.!
자주 반복된 질문에도 답변해주셔서 너무 감사합니다
https://ssungkang.tistory.com/entry/Django-Authentication-%EA%B3%BC-Permissions
0
KeyError at /post/
'pk'
에러가 발생합니다
get object 시 pk를 어떻게 설정해야할지 모르겠습니다...! (아직 강의를 끝까지 안들은 탓도 있지만...)
모델과 serializer은 처음 질문에 말씀드린 것과 달라진 내용이 없습니다
perform_create 가 수행되는 시점은 클라이언트로부터 전달받은 값에 대한 유효성 검사를 마친 뒤에, 그 값을 저장하는 시점입니다. 그래서 아직 DB에 데이터가 저장되지 않은 상황이기에 get_object_or_404도 불가하구요.
그리고 Post 생성 요청 URL에는 pk 가 없죠. 그러니 self.kwargs["pk"] 값도 존재하지 않습니다. 그래서 KeyError가 발생하는 것입니다.
perform_create 의 기본 구현은 serializer.save() 입니다.
관련코드 : https://github.com/encode/django-rest-framework/blob/3.13.1/rest_framework/mixins.py#L24
그래서 이를 구현한다면 serializer.save(author=self.request.user) 코드만 쓰셔도 충분합니다.
화이팅입니다. :-)
0
안녕하세요.
Post 모델에서는 author 외래키 필드가 있습니다. author 필드값을 지정하지 않고 Post 모델을 저장할 때, 말씀하신 NOT NULL constraint failed: instagram_post.author_id 예외가 발생합니다.
PostViewSet에서 Post create API 동작을 수행할 때, author 값은 유저로부터 전달받는 것이 아니라, 인증(세션 혹은 JWT 등)이 수행되어 현재 로그인 유저인 request.user 값을 author 필드 값으로 할당해야만 합니다.
이를 위해 ViewSet에서는 이를 perform_create 메서드를 재정의하여, Post 저장 시에 추가로 author=request.user 값을 추가로 지정하여 저장을 하셔야 합니다.
살펴보시고, 궁금하신 부분은 추가 질문 주세요.
화이팅입니다. :-)
현재 인증된 상황이 아니라서 그렇습니다. 인증된 상황이어야, request.user 가 인증된 유저 객체를 담고 있게 됩니다.
장고 기본에서도 request.user는 동일하게 사용이 됩니다. 로그인 상황에서는 User 모델의 인스턴스이며, 로그인 상황이 아닐 때에는 AnonymousUser라는 파이썬 클래스 인스턴스가 됩니다. 모델 인스턴스가 아니기 때문에 모델의 관계필드에 값 할당이 불가합니다.
위 에러는 AnonymousUser 인스턴스를 author 필드에 할당하시고 저장을 시도하셨기 때문에 발생하는 오류입니다.
이 문제를 해결하실려면, api 요청에서 인증이 처리될 수 있도록, Authorization 헤더를 설정해주셔야 합니다.
화이팅입니다 :-)