【问题标题】:django rest framework - using viewsetsdjango rest 框架 - 使用视图集
【发布时间】:2015-08-04 09:53:44
【问题描述】:

我阅读了 django 中的视图集,但还没有完全理解所有内容..

例如在 django 中使用视图集时 -

class SnippetViewSet(viewsets.ModelViewSet):
    """
    This viewset automatically provides `list`, `create`, `retrieve`,
    `update` and `destroy` actions.

    Additionally we also provide an extra `highlight` action.
    """
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                          IsOwnerOrReadOnly,)

    @detail_route(renderer_classes=[renderers.StaticHTMLRenderer])
    def highlight(self, request, *args, **kwargs):
        snippet = self.get_object()
        return Response(snippet.highlighted)

路由是这样的

router = DefaultRouter()
router.register(r'snippets', views.SnippetViewSet)

在视图中的 cmets 中,他们说 -“此视图集自动提供 listcreateretrieveupdatedestroy 操作。”

编辑:::

 @detail_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)
  • 如何访问这些方法中的每一种?以及如何访问 highlight 方法?
  • 在路由器中注册的url是/sn-ps。我做 sn-ps/create 吗?还是sn-ps/删除?
  • ModelViewSet 实际上对 url 结构做了什么?

【问题讨论】:

标签: python routing views django-rest-framework


【解决方案1】:

您可以通过指定相应的 HTTP 方法来访问这些操作,这是 REST 的核心思想。也就是说,使用 HTTP 方法来做他们名字所暗示的事情。

  • GET /snippets/ - 列出 sn-p 对象
  • POST /snippets/ 带有 POST 数据 - 创建一个新对象
  • PATCH /snippets/ 带数据 - 创建一个新对象
  • GET /snippets/42 - 检索主键为 42 的对象
  • PUT/PATCH /snippets/42 - 使用主键 42 更新对象
  • DELETE /snippets/42 - 删除主键为 42 的对象

要查看所有生成和推断的 URL 正则表达式,请输入 Django in debug mode 并向无效 URL 发出请求。它会打印出如下内容:

Using the URLconf defined in my_app.urls, Django tried these URL patterns, in this order:
^ ^$ [name='api-root']
^ ^\.(?P<format>[a-z0-9]+)$ [name='api-root']
^ ^AltEmail/$ [name='altemail-list']
^ ^AltEmail/\.(?P<format>[a-z0-9]+)$ [name='altemail-list']
^ ^AltEmail/(?P<pk>[^/.]+)/$ [name='altemail-detail']
^ ^AltEmail/(?P<pk>[^/.]+)/\.(?P<format>[a-z0-9]+)$ [name='altemail-detail']
[...]

【讨论】:

  • 感谢您的回答。所以假设我有一个 UserViewSet(viewsets.ReadOnlyModelViewSet),所以我只有 GET /users(列表)和 GET /users/42(用户编号 42)?
  • 差不多。还有一个小细节。您可以添加一个后缀来覆盖您的请求标头的content-type。例如/users/.json/users/42/.json。你会在正则表达式中看到(?P&lt;format&gt;[a-z0-9]+)
  • 知道了。还有一件事,如果我添加一个 detail_route 装饰器(请参阅我编辑的问题),访问此方法将是 users/register/?
  • 我没用过that specific feature,但是根据这个sn-p ^users/{pk}/set_password/$,也许你只能通过主键访问它?无论如何,我不知道。最好尝试一下:-D
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2020-06-09
  • 2020-08-08
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
相关资源
最近更新 更多