2015-03-10 14 views
11

Tôi có aa ModelViewSet trong khung REST của Django cung cấp cho tôi khả năng để làm một POST và GET qua địa chỉ sau:Overriding Django REST của ViewSet với bài tùy chỉnh phương pháp và mô hình

api/v1/users

Những Người dùng có aa đảo ngược liên quan đến một bảng nhận xét và tôi muốn để có thể truy cập vào các nhận xét thông qua URL:

api/v1/users/<username>/comments

tôi đã có thể làm điều này bằng cách thiết lập một tùy chỉnh @detail_route bằng cách ghi đè queryset và và serializer_class nhưng nó chỉ hoạt động cho các yêu cầu GET. Nếu tôi cố gắng để viết bình luận mới thông qua phần admin Khung của REST, tôi nhận được một thông báo lỗi nêu rõ "đối tượng 'ListSerializer' không Iterable"

Dưới đây là mã của tôi:

class UserViewSet(viewsets.ModelViewSet): 
    queryset   = User.objects.all() 
    serializer_class = UserFlat 
    lookup_field  = 'username' 


    @detail_route(methods=['post','get']) 
    def comment(self, request, **kwargs): 

     user = self.get_object() 

     self.queryset   = Comment.objects.filter(recipient=user.id) 
     self.serializer_class = CommentFlat 

     serializer = CommentFlat(instance=self.queryset, many=True) 

     return Response(serializer.data) 

Các bình luận mới nên các thông số sau:

comment.author, comment.message, comment.recipient

tôi có thể nhập tất cả các lĩnh vực trong bảng quản trị và cố gắng để tạo ra một yêu cầu bưu điện, nhưng nó không thành công. Lý tưởng nhất, tôi chỉ nên điền vào comment.message và comment.author và trường comment.recipient sẽ được tự động điền với user.id được lấy trong url api/v1/users/<username>/comments

Có ai biết tại sao yêu cầu bài đăng của tôi không hoàn thành và cách tôi có thể tự động điền một trường đó?

Trả lời

14

Tôi đã tìm ra. Đối với những người đang tìm kiếm một câu trả lời là tốt, giải pháp là để xác định rõ ràng các hành động xảy ra khi request.method == 'POST' và chuyển một đối tượng vào bộ nối tiếp.

@detail_route(methods=['post','get']) 
    def comment(self, request, **kwargs): 

     user = self.get_object() 

     self.queryset = Comment.objects.filter(recipient=user.id) 
     self.serializer_class = CommentFlat 

     if request.method == 'POST': 

      # request.data is from the POST object. We want to take these 
      # values and supplement it with the user.id that's defined 
      # in our URL parameter 
      data = { 
       'comment': request.data['comment'], 
       'rating': request.data['rating'], 
       'author': request.data['author'], 
       'recipient': user.id 
      } 

      serializer = CommentFlat(data=data) 

      if serializer.is_valid(): 
       serializer.save() 
       return Response(serializer.data, status=status.HTTP_201_CREATED) 
      else: 
       return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

     # Return GET by default 
     else: 

      serializer = CommentFlat(instance=self.queryset, many=True) 

      return Response(serializer.data) 
Các vấn đề liên quan