在Django中实现不同APIView类中的HTTP方法

6kkfgxo0  于 2022-11-18  发布在  Go
关注(0)|答案(1)|浏览(107)

我有一个API,有两个路由some_resource/some_resource/<id>,我想实现普通的CRUD操作(列表、检索、创建、更新、删除)。但是,我不想使用ViewSet,因为我想为每个视图设置一个类。因此,为了清楚起见,我需要手动设置路由。:

  1. class SomeResourceRetrieveView(APIView):
  2. def get(self, request, pk, *args, **kwargs):
  3. ...
  4. class SomeResourceListView(APIView):
  5. def get(self, request, *args, **kwargs):
  6. ...
  7. class SomeResourceCreateView(APIView):
  8. def post(self, request, *args, **kwargs):
  9. ...

在www.example.com中urls.py,它看起来像这样

  1. url_patterns = [
  2. path("some_resource/", InvitationTeamAccessListAPI.as_view(), name="some-resource-list"),
  3. path("some_resource/", InvitationTeamAccessCreateAPI.as_view(), name="some-resource-create"),
  4. path("some_resource/<int:pk>", InvitationTeamAccessRetrieveAPI.as_view(), name="some-resource-retrieve"),
  5. ]

但是当我在some_resource/上使用POST时,我得到了一个405。我想django在第一个匹配的路径上停止了,并且没有找到post的实现。有没有一种方法可以把我所有的视图插入到同一个模式中,但是把它们作为单独的类来保存呢?

sirbozc5

sirbozc51#

您可以使用ViewSets
给予看:

  1. from rest_framework import viewsets
  2. from rest_framework.response import Response
  3. class InvitationTeamAccessViewSet(viewsets.ViewSet):
  4. """
  5. Example empty viewset demonstrating the standard
  6. actions that will be handled by a router class.
  7. If you're using format suffixes, make sure to also include
  8. the `format=None` keyword argument for each action.
  9. """
  10. def list(self, request):
  11. # this is your get() method
  12. queryset = InvitationTeamAccess.objects.all()
  13. # you should change your serializer name accordingly
  14. serializer = InvitationTeamAccessSerializer(queryset, many=True)
  15. return Response(serializer.data)
  16. def create(self, request):
  17. # this is your post method
  18. # you have to write you post logic here
  19. pass
  20. def retrieve(self, request, pk=None):
  21. # this is your get() details method
  22. queryset = InvitationTeamAccess.get(pk=pk)
  23. # you should change your serializer name accordingly
  24. serializer = InvitationTeamAccessSerializer(queryset)
  25. return Response(serializer.data)
  26. def update(self, request, pk=None):
  27. # write your post() method here
  28. pass
  29. def partial_update(self, request, pk=None):
  30. pass
  31. def destroy(self, request, pk=None):
  32. pass

以及www.example.com中urls.py

  1. from myapp.views import InvitationTeamAccess
  2. from rest_framework.routers import DefaultRouter
  3. router = DefaultRouter()
  4. router.register(r'some_resource/', InvitationTeamAccess, basename='InvitationTeamAccess')
  5. urlpatterns = router.urls

然后使用单个url路径可以执行多个操作
GET:some_resource/将显示邀请团队访问的
GET:some_resource/1/将显示单个邀请团队访问的详细信息
POST:some_resource/将创建新的邀请团队访问权限
我还阅读了ModelVieset

展开查看全部

相关问题