2016-06-17 6 views
1

Я использую Django REST Framework для создания конечной точки, которая будет создавать PDF-документ. Документ PDF будет содержать информацию, соответствующую определенному Department. У меня есть две желаемые функции - возможность загрузки PDF-документа и возможность предварительного просмотра документа в браузере.Django REST Framework - не может переопределить список в ListAPIView

Поскольку документ PDF изменяется со временем на основе данных, добавленных в приложение, документ необходимо сгенерировать в реальном времени, когда он запрашивается. В качестве первого шага я пытаюсь иметь документ быть сгенерированы в удаленном месте хранения файлов при следующих конечных точек ударил по GET запросу:

departments/<department_pk>/result/preview

Поскольку моя конечная точка должна принимать только GET запросы, Я использую ListAPIView. Я пытаюсь переопределить метод list, чтобы моя логика генерации пользовательского документа выполнялась, но похоже, что метод никогда не вызывается. Как я могу добавить в конечную точку некоторую логику генерации документов, чтобы она выполнялась, когда конечная точка попала в запрос GET?

апи/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) 
+0

Мне кажется, что вы должны использовать 'RetrieveAPIView'. 'ListAPIView' предназначен для возврата коллекции. 'Retrieve ...' предназначен для получения одного экземпляра. Говоря это, я не понимаю, почему «список» вообще не будет вызван. – Louis

+0

@ louis да, не имеет смысла и для меня. Первоначально я использовал «RetrieveAPIView», но переключился на «ListAPIView», потому что не был уверен, нужен ли мне «pk» в конце моего URL-адреса для «RetrieveAPIView», и, возможно, именно поэтому он не работал. – orange1

ответ

1

В вашем document_app/urls.py, вы неправильно передавая ResultDocumentDetailView в качестве аргумента вместо режима просмотра.

Router while registering принимает ViewSet вместо APIView.

Есть два обязательных аргументов метода register():

prefix - префикс URL использовать для этого набора маршрутов.
viewset - просмотров класс.

Кроме того, поскольку вы заинтересованы только в методе retrieve, вы можете просто создать ResultDocumentRetrieveView и добавить его соответствующий URL-адрес для вашей urls.py без необходимости создания ResultDocument маршрутизатора. (Маршрутизаторы, как правило, используется, когда вы хотите, чтобы обрабатывать как list и detail запросы.)

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) 

URLs.py

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

заменить метод списка с кодом ниже, я думаю, что это будет работать

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) 

для получения дополнительной справки см метод «список» overrinding

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

+0

Хм не слишком уверен, как это отличается от кода кода, который я дал? Минус отступа, который, кажется, выключен. Я что-то упускаю? Благодарю. – orange1

+0

@ orange1 Вы не определяете метод «список» правильно. правильное определение - «def list (self, request, * args, ** kwargs):». ты пробовал ? Это будет работать. –

+0

Да, я попробовал. Это не работает. – orange1

Смежные вопросы