Django REST Framework

구현 - APIView

Classy Django REST Framework
Full API 레퍼런스 문서
(Detailed descriptions, with full methods and attributes, for each of Django REST Framework's class-based views and serializers)
http://www.cdrf.co/
Python에서 **의 의미 참고:
https://mingrammer.com/understanding-the-asterisk-of-python/
**validated_data 등에서 사용하는 것은 keyword arguments만 가져오는 것 의미
APIView를 사용하여 ReviewCycle에 creator를 넣을 때,
creator는 로그인한 유저 데이터라 request.data에 포함되지 않아 별도 처리를 하지 않으면 is_valid()에서 False 리턴.
따라서 request.data['creator'] = request.user.id처럼 할당해주었는데, id를 이렇게 할당하는 게 맞는지??

--> 조금 더 찾아본 결과, Serializer에 HiddenField를 추가하는 방법이 있는 듯함
https://stackoverflow.com/questions/51940976/django-rest-framework-currentuserdefault-with-serializer
https://www.django-rest-framework.org/api-guide/fields/#hiddenfield

----> 더 찾아본 결과, Serializer에 필드 선언 시 CurrentUserDefault, CreateOnlyDefault 등의 옵션이 있음
https://www.django-rest-framework.org/api-guide/validators/#createonlydefault

------> 이것저것 해보니, creator는 변경될 일이 없다면 Serializer에서 필드는 read_only로 만들고, View단에서 save에 인자로 creator=request.user 등을 넘겨주는 것이 좋을 듯함(여기서 creator는 모델로 직접 연결됨)
참고 
https://stackoverrun.com/ko/q/9791631
https://stackoverflow.com/a/58774665/6198924
ManyToManyField의 경우 모델의 save()로 저장할 수 없어서, Serializer의 create 메소드 오버라이드 후 만들어진 객체에 .set()으로 처리함. 이 방법이 맞는지??
Put 구현 시, Post 구현 시와 마찬가지로 request.data에 creator를 명시적으로 넣어주어야 data 파트의 is_valid 통과가 되는데, creator는 업데이트할 필요가 없는 경우이므로 이때는 partial_update로 처리를 해야 하는지?
--> Serializer에서 필드를 read_only로 업데이트하면서 넣지 않아도 되도록 해결됨
Serializer에서 update override 시,
instance.name = validated_data.get('name', instance.name)
메소드 내에서 위와 같은 패턴을 많이 쓰게 되는데, 장고가 따르는 DRY(Don't Repeat Yourself) 원칙에 잘 맞지 않는 듯함. 다른 방식으로 업데이트하는 방법이 있는지?

댓글

댓글 본문
버전 관리
김시준
현재 버전
선택 버전
graphittie 자세히 보기