gpt4 book ai didi

Django Rest 框架 : POST to Viewset with URL parameter

转载 作者:行者123 更新时间:2023-12-04 04:17:29 25 4
gpt4 key购买 nike

通常,在 DRF View 集中,您可能会执行以下操作:

class FooViewSet(viewsets.ViewSet):
"""
Foo-related viewsets.
"""
permission_classes = [IsAuthenticated,]

def list(self, request):
"""
A list of foo objects.
"""
context = {'request': self.request}
queryset = Foo.objects.all()
serializer = FooSerializer(queryset, many=True, context=context)
return Response(serializer.data)

def retrieve(self, request, pk=None):
"""
Get one publicly available Foo item.
"""
context = {'request': self.request}
queryset = Foo.objects.all()
store_object = get_object_or_404(queryset, pk=pk)
serializer = FooSerializer(store_object, context=context)
return Response(serializer.data)

这工作正常,并分别与:
GET /fooGET /foo/<pk> .但是,我需要的最后一个端点是 POST /foo/<pk> .这里的问题是提供一个 create View 的方法通常会被路由到 POST /foo .我可以从 ViewSet 本身中做一些简洁优雅的事情吗?或者是基本上路由 POST /foo/<pk>的唯一选择到特定的一次性 View ?

最佳答案

所以,我会在你的 urls.py 中说对于您需要的 REST 端点:

urlpatterns = [
path(
'/foo',
viewsets.FooViewSet.as_view({'post': 'create'}),
name='Create Foo',
),
path(
'/foo',
viewsets.FooViewSet.as_view({'get': 'list'}),
name='List Foo',
)
path(
'/foo/<pk>',
viewsets.FooViewSet.as_view({'get': 'retrieve'}),
name='Retrieve Foo',
)
]

惯例是只有 patch (部分更新)或 put (更新)到 /foo/<pk>端点。

所以,发到基地 /foo端点,带有要创建的对象的 JSON 反序列化表示(减去 pk,让数据库动态创建 pk)。

如果你想更新 foo,那么只需添加:
urlpatterns = [
...
path(
'/foo/<pk>',
viewsets.FooViewSet.as_view({'put': 'update'}),
name='Update Foo',
),
path(
'/foo/<pk>',
viewsets.FooViewSet.as_view({'patch': 'partial_update'}),
name='Partially Update Foo',
)
]

这将对应于您的 FooViewSet 如下,作为最基本的示例:
class FooViewSet(viewsets.ViewSet):

def list(self, request):
pass

def create(self, request):
pass

def retrieve(self, request, pk=None):
pass

def update(self, request, pk=None):
pass

def partial_update(self, request, pk=None):
pass

def destroy(self, request, pk=None):
pass

用您想要的代码替换每个所需的端点。不通过也会禁止该方法,例如,如果您希望禁用 API 上的销毁操作,这将很方便。

附录 :值得补充的是,您还可以执行以下操作:
urlpatterns = [
path(
'/foo',
viewsets.FooViewSet.as_view({'post': 'custom_post_action'}),
name='Create Foo',
),

与您对应的 FooViewSet() :
class FooViewSet(viewsets.ViewSet):
...

@action(methods=['post'], detail=False, permission_classes=[SomePermissionClass], url_path='?', url_name='?')
def custom_post_action(self, request):
pass

如果您愿意,我觉得这可能是不好的做法,并不能真正代表“ RESTful”原则,但是如果您需要,谁会提供 CRUD?

关于Django Rest 框架 : POST to Viewset with URL parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60359641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com