gpt4 book ai didi

python - Django Rest Framework 文档中不显示具有多个方法的多个嵌套资源

转载 作者:太空宇宙 更新时间:2023-11-03 14:55:15 25 4
gpt4 key购买 nike

我想知道为什么 Django REST Framework 内置文档不显示用户的方法。我对这些 URL 仅有可用的 listcreatereadupdate:

url(r'^users$', views.UserList.as_view()),
url(r'^users/(?P<user_id>\w+)$', views.UserDetail.as_view()),

views.py:

@permission_classes([CustomPermission])
class UserList(GenericAPIView):

"""
get: Return all users.
post: Create a user.
"""

serializer_class = UserSerializer

def get(self, request):

users = User.objects.all()
serializer = UserSerializer(users, many=True)
return Response(serializer.data)

def post(self, request):
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


@permission_classes([UserPermission])
class UserDetail(GenericAPIView):

"""
get: Return user by ID.
put: Update user by ID.
delete: Delete user by ID.
"""

serializer_class = UserSerializer

def get(self, request, user_id):

try:
user = User.objects.get(id=user_id)
except User.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
serializer = UserSerializer(user)
return Response(serializer.data)

def put(self, request, user_id):

try:
user = User.objects.get(id=user_id)
except User.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
serializer = UserSerializer(user, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

def delete(self, request, user_id):

try:
user = User.objects.get(id=user_id)
except User.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
user.delete()
return Response(status=status.HTTP_204_NO_CONTENT)

但是,下面显示的示例在内置文档中不可见。我的项目中还有 Swagger 文档,并且所有内容都显示正确。

url.py:

url(r'^users/(?P<user_id>[0-9]+)/object$', views.UserObject.as_view()),

views.py:

@permission_classes([UserPermission])
class UserObject(GenericAPIView):

"""
post: Create a user object by his ID.
get: Return a user object by his ID.
put: Update a user object by his ID.
delete: Delete a user object by his ID.
"""

serializer_class = ObjectSerializer

def post(self, request, user_id):

try:
Object.objects.get(user=user_id)
return Response(status=status.HTTP_403_FORBIDDEN)


except Object.DoesNotExist:
serializer = ObjectSerializer(data=request.data)
serializer.fields['user'].required = False
if serializer.is_valid():
serializer.save(user_id=user_id)
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


def get(self, request, user_id):
try:
object = Object.objects.get(user=user_id)
except Object.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
serializer = ObjectSerializer(object)
return Response(serializer.data)

def put(self, request, user_id):
try:
object = Object.objects.get(user=user_id)
except Object.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
serializer = ObjectSerializer(object, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

def delete(self, request, user_id):
try:
object = Object.objects.get(user=user_id)
except Object.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
object.delete()
return Response(status=status.HTTP_204_NO_CONTENT)

应该有可见的路径users/{user_id}/object知道为什么不是吗?

enter image description here

最佳答案

编辑2017-08-19

我做了一个PR with the fix已经被合并了。所以可能会尝试获取最新版本。

编辑2017-08-13

这是一个bug使用 DRF 默认文档,文档中不会显示具有多种方法的额外操作。

解决方案:使用swagger

原创

我尝试重现它,看起来 django-rest-frameworkcoreapi 中存在错误。

我尝试过使用文档生成器 swagger对于rest-framework,它看起来不错。

url 中存在错误,如果您从 users/{user_id}/object 中删除 object,它就会起作用。例如,如果您尝试 xsers/{user_id}/ ,它就会起作用。

swagger example

您可以使用 ViewSet 更改设计方法。ViewSet 提供actions,而不是直接映射到method。这是另一个抽象级别,通常更清晰。

class UserViewSet(viewsets.ViewSet):
"""
retrieve:
Return the given user.

list:
Return a list of all the existing users.

create:
Create a new user instance.

update:
Update a user.
"""

serializer_class = UserSerializer

def list(self, request):
# Here you should put the code for GET user/
pass

def create(self, request):
# Here you should put the code for POST user/
pass

def retrieve(self, request, pk=None):
# Here you should put the code for RETRIEVE user/{pk}
pass

def update(self, request, pk=None):
# Here you should put the code for UPDATE user/{pk}
pass

@detail_route(methods=['get'])
def objects(self, request, pk=None):
if request.method == 'GET'
....

在你的网址中

from myapp.views import UserViewSet
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'users', UserViewSet)
urlpatterns = router.urls

更多信息http://www.django-rest-framework.org/api-guide/viewsets/#marking-extra-actions-for-routing

关于python - Django Rest Framework 文档中不显示具有多个方法的多个嵌套资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45630610/

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