2015-05-23 21 views
5

Trong mã của tôi, tôi có một viewset cho User. Tôi muốn chỉ cho phép các hoạt động Đọc (/người dùng/42/users/) mà ReadOnlyModelViewSet thực hiện tốt.django rest framework - sử dụng detail_route và detail_list

Ngoài ra, tôi muốn có một số /người dùng/đăng ký URL mà tôi có thể POST để đăng ký Người dùng mới.

class UserViewSet(viewsets.ReadOnlyModelViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 

    @list_route(methods=['post']) 
    def register(request): 
     serializer = UserSerializer(data=request.DATA) 
     if serializer.is_valid(): 
      user = User.objects.create_user(
       username = serializer.init_data['username'], 
       password = serializer.init_data['password'], 
      ) 

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

Vài câu hỏi:

  • này có được điều này đúng cách để làm điều đó?

  • Có một cụ chữ ký cho một phương pháp nếu tôi đặt nó trong một list_route hoặc detail_route trang trí? vì trong các ví dụ detail_route luôn cùng một chữ ký của nó đối với phương pháp: method_name (tự, yêu cầu, pk = Không):

cảm ơn!

Trả lời

7

Mã của bạn là gần như chính xác, bạn chỉ thiếu chữ ký đúng vào phương pháp đăng ký:

def register(self, request): 

Đây là chữ ký đúng theo the documentation. Ngoài ra the tests gợi ý rằng nó không thể vượt qua một tham số bổ sung cho việc định tuyến, và pk rằng sẽ luôn được chuyển cho một @detail_route, vì vậy bạn sẽ cần phải có:

@detail_route 
def register(self, request, pk=None): 

cho các tuyến đường chi tiết và

@list_route 
def register(self, request): 

cho các tuyến danh sách.

Tuy nhiên tôi sẽ đề nghị bạn tận dụng lợi thế của việc xây dựng trong ViewSetMixins as ModelViewSet does internally:

from rest_framework import exceptions, mixins 
class UserViewSet(mixins.CreateModelMixin, 
       mixins.RetrieveModelMixin, 
       mixins.ListModelMixin, 
       GenericViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 
    def create(self, request): 
     serializer = UserSerializer(data=request.DATA) 
      if serializer.is_valid(): 
       user = User.objects.create_user(
        username = serializer.init_data['username'], 
        password = serializer.init_data['password'], 
       ) 

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

Đối up dấu hiệu sử dụng nói chung bạn cũng có thể có một cái nhìn tại django-registration-restframework mà tôi đang làm việc cho dự án của tôi.

Cá nhân tôi dựa vào ModelViewSet trong các dự án của mình và đảm bảo chỉ những người dùng được ủy quyền phù hợp mới có thể thực hiện một số hành động nhất định. Để thực hiện việc này, bạn có thể sử dụng mô hình rộng permissions hoặc kết hợp với các quyền đối tượng cụ thể đối với django guardian.

Đặc biệt với API REST, cuối cùng bạn sẽ đến điểm mà bạn muốn người dùng nhất định chỉ thực hiện các tác vụ trên một số đối tượng nhất định mà không phải vi phạm mọi yêu cầu. Quyền đối tượng cấp có thể được sử dụng tuyệt vời ở đây.

+1

cảm ơn câu trả lời của bạn, tôi sẽ xem xét. một câu hỏi - ModelviewSet cho phép GET, POST, PATCH, GET và DELETE. khi bạn ghi đè lên phương thức cập nhật và nâng cấp một NotAllowed - nó sẽ chỉ tốt cho POST và PATCH? hoặc cũng cho DELETE?Tôi có nghĩa là nó bao gồm tất cả các phương pháp bên cạnh GET và POST để tạo ra? chỉ cố gắng đảm bảo rằng tôi chỉ cho phép các phương pháp mong muốn –

+0

Bạn hoàn toàn đúng. Tôi đã sửa đổi mã để sử dụng mixin chính xác một cách rõ ràng, thay vì khỉ vá mã sửa đổi. –

Các vấn đề liên quan