Python Django REST框架-can';t在ListAPIView中重写列表

Python Django REST框架-can';t在ListAPIView中重写列表,python,django,rest,django-rest-framework,Python,Django,Rest,Django Rest Framework,我正在使用Django REST框架创建一个端点,该端点将生成一个PDF文档。PDF文档将包含与特定部门相对应的信息。我有两个想要的功能——能够下载PDF文档,并且能够在浏览器中预览文档 由于PDF文档根据添加到应用程序中的数据随时间而变化,因此需要在请求时实时生成文档。作为第一步,当以下端点被GET请求击中时,我尝试在远程文件存储位置生成文档: 部门//结果/预览 因为我的端点应该只接受GET请求,所以我使用的是ListAPIView。我试图覆盖list方法,以便执行自定义文档生成逻辑,但似乎

我正在使用Django REST框架创建一个端点,该端点将生成一个PDF文档。PDF文档将包含与特定部门相对应的信息。我有两个想要的功能——能够下载PDF文档,并且能够在浏览器中预览文档

由于PDF文档根据添加到应用程序中的数据随时间而变化,因此需要在请求时实时生成文档。作为第一步,当以下端点被
GET
请求击中时,我尝试在远程文件存储位置生成文档:

部门//结果/预览

因为我的端点应该只接受
GET
请求,所以我使用的是
ListAPIView
。我试图覆盖
list
方法,以便执行自定义文档生成逻辑,但似乎从未调用该方法。如何将一些自定义文档生成逻辑插入到端点中,以便在端点被
GET
请求击中时执行该逻辑

api/url.py

url(r'^departments/(?P<department_pk>[0-9]+)/result/preview',
    include(result_document_urls.result_document_preview_router.urls,
文档\u app/views.py

class ResultDocumentDetailView(generics.ListAPIView):

    queryset = Department.objects.all()
    lookup_field = 'department_pk'
    lookup_url_kwarg = 'department_pk'

    def list(self, request, department_pk):
        queryset = self.get_queryset()
        import ipdb; ipdb.set_trace() # this break point is never hit
        department = get_object_or_404(queryset, department_pk=department_pk)
        ...generate document logic...
        return Response(status=status.HTTP_200_OK)

用下面的代码替换列表方法,我认为它会起作用

class ResultDocumentDetailView(generics.ListAPIView):

    queryset = Department.objects.all()
    lookup_field = 'department_pk'
    lookup_url_kwarg = 'department_pk'

    def list(self, request, *args, **kwargs):
        queryset = self.get_queryset()
        import ipdb; ipdb.set_trace() # this break point is never hit
        department = get_object_or_404(
            queryset, department_pk=kwargs.get('department_pk')
        )

        ...generate document logic...

        return Response(status=status.HTTP_200_OK)
有关更多参考信息,请参见过度缠绕方法“列表”


在您的
文档\u app/url.py
中,您错误地将
ResultDocumentDetailView
作为参数而不是视图集传递

路由器接受
视图集
而不是
APIView

register()
方法有两个必需参数:

前缀
-用于这组路由的URL前缀。
viewset
-视图集类

此外,由于您只对
retrieve
方法感兴趣,因此只需创建
resultdocumententretrieveview
并将其相应的url添加到
url.py
中,而无需创建
ResultDocument
路由器。(路由器通常用于处理
list
detail
请求。)

url.py

url(r'^departments/(?P<department_pk>[0-9]+)/result/preview', ResultDocumentRetrieveView.as_view())
url(r'^departments/(?P[0-9]+)/result/preview',ResultDocumentRetrieveView.as_view())

在我看来,您应该使用
RetrieveAppView
ListAPIView
用于返回集合<代码>检索…用于获取一个实例。话虽如此,我不明白为什么
list
无论如何都不会被调用。@louis是的,对我来说也没有意义。我最初使用的是
retrieveapieview
,但后来改用了
ListAPIView
,因为我不确定是否需要在我的URL末尾为
retrieveapieview
添加一个
pk
,也许这就是它不起作用的原因。嗯,不太确定这与我给出的示例代码有什么不同?减去压痕,它似乎是关闭的。我错过什么了吗?谢谢。@orange1您没有正确定义方法“list”。正确的定义是“定义列表(self、request、*args、**kwargs):”。你试过了吗?它会起作用的。
class ResultDocumentRetrieveView(generics.RetrieveAPIView):

    queryset = Department.objects.all()
    lookup_field = 'department_pk'
    lookup_url_kwarg = 'department_pk'

    def retrieve(self, request, department_pk):
        department = self.get_object()
        ...generate document logic...    
        return Response(status=status.HTTP_200_OK)
url(r'^departments/(?P<department_pk>[0-9]+)/result/preview', ResultDocumentRetrieveView.as_view())