#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")
]