Skip to main content
 首页 » 编程设计

python之Django REST Framework之无法覆盖 ListAPIView 中的列表

2024年08月22日29pander-it

我正在使用 Django REST Framework 创建一个将生成 PDF 文档的端点。 PDF 文档将包含与特定 Department 相对应的信息.我有两个所需的功能——能够下载 PDF 文档,以及能够在浏览器中预览文档。

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

departments/<department_pk>/result/preview

因为我的端点应该只接受 GET请求,我正在使用 ListAPIView .我正在尝试覆盖 list方法以便执行我的自定义文档生成逻辑,但看起来该方法从未被调用过。我怎样才能将一些自定义文档生成逻辑插入到我的端点中,以便在端点被 GET 击中时执行它要求?

api/urls.py

url(r'^departments/(?P<department_pk>[0-9]+)/result/preview', 
    include(result_document_urls.result_document_preview_router.urls, 

document_app/urls.py

result_document_preview_router = routers.DefaultRouter() 
 
result_document_preview_router.register(r'^', ResultDocumentDetailView.as_view(), 
    base_name='Department') 

document_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) 

有关更多引用,请参阅覆盖方法“list”

https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/mixins.py#L35