django休息框架相同的路线,不同

时间:2017-11-17 22:09:18

标签: python django rest django-rest-framework

我使用django rest框架构建api,这是我的问题

url(r'^profiles/(?P<pk>[0-9]*)', ProfileRetrieveView.as_view(), name='profiles-detail'),
url(r'^profiles/(?P<pk>[0-9]*)', ProfileUpdateView.as_view(), name='profiles-update'),
    class ProfileRetrieveView(RetrieveAPIView):

    queryset = Profile.objects.all()
    serializer_class = ProfileSerializer

class ProfileUpdateView(UpdateAPIView):

    queryset = Profile.objects.all()
    serializer_class = ProfileSerializer
    permission_classes = (IsAuthenticated, )

当我使用链接/ profile / 2和方法补丁查询api时,我收到405,方法不允许,只允许get方法,如何解决这个问题而无需将我的两个视图类转换为on带有GenericView Base类和Retrive + update Mixins的类。

3 个答案:

答案 0 :(得分:1)

<强> urls.py

   id    x  y  z
0   0  324  1  2
2   2  529  2  1
3   3  347  3  2
4   4  109  2  2

<强> views.py

url(r'^profiles/(?P<pk>[0-9]*)', ProfileRetrieveUpdateView.as_view(), name='profiles-detail-update'),

答案 1 :(得分:0)

您应该将其压缩到一个端点中。您可以让一个类处理所有列表,更新,获取等。试试......这样的事情:

from rest_framework import mixins, viewsets
class ProfileUpdateView(viewset.ModelViewSet,
                        mixins.ListModelMixin,
                        mixins.UpdateModelMixin):

    serializer_class = ProfileSerializer
    permission_classes = (IsAuthenticated, )

    get_queryset(self):
          return Profile.objects.all()

如果您正在使用纯模型,请使用内置模型,并查看mixins。它将为您节省通用代码编写量。它有一些魔法知道如何将请求路由到匹配的http方法。

http://www.django-rest-framework.org/api-guide/generic-views/#mixins

答案 2 :(得分:0)

Django rest框架提供了不需要Mixins的通用视图。 您可以直接使用RetrieveUpdateAPIView。提供请求方法get以检索数据,put更新数据和patch以进行部分更新。

from rest_framework.generics import RetrieveUpdateAPIView

class ProfileUpdateView(RetrieveUpdateAPIView):
    queryset = Profile.objects.all()
    serializer_class = ProfileSerializer
    permission_classes = (IsAuthenticated, )

参考:http://www.django-rest-framework.org/api-guide/generic-views/#retrieveupdateapiview