get_queryset для ListCreateAPIView не вызывается - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть ListCreateAPIView, который я пытаюсь переопределить get_queryset, но он никогда не вызывается.Вот мое мнение:

class DeviceView(generics.ListCreateAPIView):
    def get_queryset(self):
        # Threw this and some print statements, but no sign of 
        # the exception or print statement
        raise Exception
        return None
    @swagger_auto_schema(
        responses={
            201: DeviceSerializer(),
        },
        request_body=DeviceSerializer,
    )
    def post(self, request, format=None):
        # This code works fine
        ...
    @swagger_auto_schema(responses={200: DeviceSerializer(many=True)})
    def get(self, request, format=None):
        # This code DOES get hit and successfully retrieves all the devices

Вот urls.py:

urlpatterns = [
    path(r"devices/<serialnumber>/abc", views.AbcView.as_view()),
    path(r"devices/<serialnumber>", views.DeviceDetailView.as_view()),
    path(r"devices/", views.DeviceView.as_view()),
    path(r"api-auth/", include("rest_framework.urls", namespace="rest_framework")),
    path(
        r"swagger/",
        schema_view.with_ui("swagger", cache_timeout=0),
        name="schema-swagger-ui",
    ),
    url(
        r"^swagger(?P<format>\.json|\.yaml)$",
        schema_view.without_ui(cache_timeout=0),
        name="schema-json",
    ),
    url(r"^api-token-auth/", obtain_jwt_token),
    path("admin/", admin.site.urls),
]

Есть какие-нибудь мысли о том, почему get_queryset не ударил / не был переопределен?

1 Ответ

0 голосов
/ 29 ноября 2018

Из кода структуры отдыха django

class ListAPIView(mixins.ListModelMixin,
                  GenericAPIView):
    """
    Concrete view for listing a queryset.
    """
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

Итак, во-первых, лучше переопределить функцию list, а не get.

class ListModelMixin(object):
    """
    List a queryset.
    """
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

Так что вы, вероятно,отсутствует супер вызов в списке или вызов self.filter_queryset.Это обеспечит вызов get_queryset.

...