Несколько методов get в одном классе в представлениях Django

#django-rest-framework

#django-rest-framework

Вопрос:

У меня есть несколько методов get в одном классе. Как мне создать URL-адреса?

Views.py

 class DashboardData(viewsets.ViewSet):
      @action(detail=True, methods=['get'])
      def get_total(self, request):
            Total = File.objects.all().count()
            return Response(Total, status=status.HTTP_200_OK)

      def get_done(self, request):
            Done = File.objects.filter(entry=True).count()
            return Response(Done, status=status.HTTP_200_OK)

      def get_not_done(self, request):
            NotDone = File.objects.filter(entry=False).count()
            return Response(NotDone, status=status.HTTP_200_OK)
            
      def get_pending(self, request):
            Pending = File.objects.filter(entry=False).count()
            return Response(Pending, status=status.HTTP_200_OK)
 

Например:
http://baser_url/dashboard/total_count следует вызвать метод get_total()
http://baser_url/dashboard/done_count следует вызвать метод done_count().

Ответ №1:

Если вы хотите более явно маршрутизировать функции просмотра, то другой способ сделать это:

 urlpatterns = [
    path('dashboard/total_count/', DashboardData.as_view({'get': 'get_total'})),
    ...,
    path('dashboard/done_count/', DashboardData.as_view({'get': 'done_count'})),
]
 

Ответ №2:

Вы можете зарегистрировать методы как пользовательские действия и задать параметр url_path .

Пример:

 class DashboardData(viewsets.ViewSet):
    @action(methods=['get'], detail=False, url_path='total_count')
    def get_total(self, request):
        Total = File.objects.all().count()
        return Response(Total, status=status.HTTP_200_OK)

    @action(methods=['get'], detail=False, url_path='done_count')
    def get_done(self, request):
        Done = File.objects.filter(entry=True).count()
        return Response(Done, status=status.HTTP_200_OK)
    
    ...

 

urls.py

 router = SimpleRouter()
router.register('dashboard', views.DashboardData, basename='dashboarddata')

 

Ответ №3:

Вы можете использовать @action декоратор, но с detail=False добавлением URL-адреса в «корень» набора представлений.

 # views.py
class DashboardViewSet(viewsets.ViewSet):
    
    @action(detail=False, url_path="download")
    def get_download(self, request):
        pass

# urls.py in your app
router = SimpleRouter()
router.register("dashboard", DashboardViewSet)
urlpatterns = router.urls
 

Из вашего примера кажется, что вам может быть достаточно создать один отдельный APIView для каждой функции, а затем добавить их вручную с помощью path

 class DashPendingView(APIView):
    def get(self, request):
        return Response(pending_things)

url_patterns = [
    path("dashboard/pending/", DashPendingView.as_view(), "dash-pending")
]