Django DRF api不返回任何值



我正在尝试使用Django rest框架DRF创建我的第一个api。下面是我的代码:

inviews.py:

class PostViewSet(viewsets.ModelViewSet):
# permission_classes = [IsAuthenticated]
@action(detail=True, methods=['GET'])
def queryset(self, request, pk=None):
try:
queryset = Post.objects.get(post_id=pk)
except Analysis.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
serializer = PostSerializer(queryset)
return Response(serializer.data)

urls.py中:

router = DefaultRouter()
router.register(r'api/post/<int:pk>/post_analysis/', PostViewSet, basename='app_name')
urlpatterns = router.urls

但是这会引发一个错误

The current path, api/post/698/post_analysis/, didn't match any of these.Not Found: /api/post/698/post_analysis/

但是当我像下面这样更改url时,它返回none:

PostView = PostViewSet.as_view({
'get': 'retrieve'
})
urlpatterns = format_suffix_patterns([
path('api/post/698/post_analysis/', PostView, name='app_name')
])

结果如下:

{
"detail": "Not found."
}

我注意到PostViewSet类的queryset()函数没有被读取。

我将首先尝试从DRF文档中实现示例ModelViewSet,看看它是否有效。例如:

class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
permission_classes = [IsAuthenticated]

我不是DRF专家,但是你的代码看起来和示例完全不同。例如,我不知道为什么你在queryset方法上有一个@action装饰器,如果你确实显式地使用queryset,那么我认为你需要使用生成queryset的。all()或。filter()管理器方法,而不是返回单个对象的。get()。但是,如果您已经正确地定义了序列化器类,那么我相信查询集取自用于定义PostSerializer的模型。即:

class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post

尝试如下修改url .py文件:

router = routers.DefaultRouter()
urlpatterns = [
path('api/post/<int:pk>/post_analysis/', include(router.urls)),   
]

配置url可能有问题

我可以在双方的帮助下解决这个问题,提供的答案如下:

inviews.py:

class PostViewSet(viewsets.ModelViewSet):

serializer_class = PostSerializer
permission_classes = [IsAuthenticated]
@action(detail=True, methods=['GET'])
def get_queryset(self, pk=None):
try:
pk = self.kwargs['pk']
queryset = Post.objects.get(post_id=pk)
return queryset
except Post.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)

and inurls.py:

router = DefaultRouter()
router.register(r'', PostViewSet, basename='app_name')
urlpatterns = [
path('api/post/<int:pk>/post_analysis/', include(router.urls)),
]

最新更新