django rest 框架 - 使用视图集
django rest framework - using viewsets
我了解了 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)
他们在 View 的评论中说 - "This viewset automatically provides list
, create
, retrieve
,update
and destroy
actions."
编辑:::
@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)
- 如何访问这些方法中的每一种?以及如何访问突出显示方法?
- 路由器中注册的url是/snippets。我做 snippets/create 吗?或 snippets/delete?
- ModelViewSet 实际上对 url 结构做了什么?
您可以通过指定相应的 HTTP 方法来访问这些操作,这是 REST 中的核心思想。即,使用 HTTP 方法来完成其名称所暗示的事情。
GET /snippets/
- 列出片段对象
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']
[...]
我了解了 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)
他们在 View 的评论中说 - "This viewset automatically provides list
, create
, retrieve
,update
and destroy
actions."
编辑:::
@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)
- 如何访问这些方法中的每一种?以及如何访问突出显示方法?
- 路由器中注册的url是/snippets。我做 snippets/create 吗?或 snippets/delete?
- ModelViewSet 实际上对 url 结构做了什么?
您可以通过指定相应的 HTTP 方法来访问这些操作,这是 REST 中的核心思想。即,使用 HTTP 方法来完成其名称所暗示的事情。
GET /snippets/
- 列出片段对象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']
[...]