이번 포스팅은 기존의 create 와 update시 저장되는 유저의 데이터를 현재 로그인한 유저로 저장되게끔 하는 방법입니다.
기존의 로직대로라면 처음 저장한 유저의 데이터로 저장되며 수정이 되지 않던 문제를 보강합니다.
해당 포스팅의 모든 소스는 아래 링크에서 확인 가능합니다. https://github.com/uiandwe/django_rest_api/tree/726c4eef6b39872dc3cbd9ca5823e637959aded0
1. 먼저 저장하는 유저를 보기위해서 시리얼라이져에 유저 필드를 추가 합니다.
post/api/serializers.py
'user' 추가
fields = [
'pk',
'user',
'title',
'content',
'created_at',
]
2. create에 perform_create() / update엔 perform_update()를 오버라이딩 합니다.
perform_create() / perform_update()는 http://www.django-rest-framework.org/api-guide/generic-views/#genericapiview에서 save and delete hooks부분에서 확인하실수 있습니다.
각각 create/ update 시 인스턴스에 대한 로직을 구성할때 쓰이는 함수들입니다. ( create시 메일을 보낸다거나 알림을 추가하는 로직을 이곳에 만들어주시면 됩니다.)
post/api/views.py
perform_create() 추가
class PostCreateAPIView(CreateAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
def perform_create(self, serializer):
serializer.save(user=self.request.user)
perform_update() 추가
class PostUpdateAPIView(UpdateAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
def perform_update(self, serializer):
serializer.save(user=self.request.user)
3. 아직 유저가 한명밖에 없으므로 어드민을 새롭게 만들어 줍니다. 저의 경우 testuser로 만들었습니다.
4. 먼저 /admin/으로 들어가서 기존의 로그이된 유저를 로그아웃 한후 방금전 새로 생성한 유저로 로그인을 합니다.
그리고 새롭게 /api/posts/create/로 들어가서 user를 기존의 유저(admin)으로 하고 POST
(오른쪽 상단을 보시면 로그인 유저가 새롭게 생성한 testuser 로 되어 있습니다.)
5. 저장이 완료 되고 저장된 유저가 저의 경우 3번으로 나오는군요. (1번은 admin / 3번은 tsetuser)
정상적으로 작동합니다.
이번 포스팅에서 중요한점은 perform_create() / perform_update()로 오버라이딩을 할수 있으며 해당 넘어오는 변수들은 self.request 에 되어 있습니다. 필요한 변수들은 해당 request로 인자값이 넘어오니 프로젝트 하실때 도움이 꼭 되실 겁니다.
'web > Django_rest_framework' 카테고리의 다른 글
8 pagination (0) | 2016.07.29 |
---|---|
7 search (0) | 2016.07.28 |
5. create (0) | 2016.07.27 |
4 update delete (0) | 2016.07.25 |
3 get detail 구현 (0) | 2016.07.25 |