Как написать функциональность в generics.ListAPIView, который может быть написан в APIView в Django DRF - PullRequest
1 голос
/ 03 августа 2020

У меня есть базовое представление функции, которое получает 2 параметра из URL http://127.0.0.1: 8000 / api / v1 / contest / 0b36d92a-51a7-4752-9df1-e5f2733116c1 / painting /

@api_view(['GET',])
@permission_classes([AllowAny])
def Contest_detail_by_id_and_category(request, id, category_name):
 
    if request.method == 'GET':
        
        artcontests = Artwork.objects.filter(artcontest = id,category__name__iexact=category_name)
        serializer = ArtworkSerializer(artcontests, many=True)
        # serializer = ArtworkSerializer(artcontests, many=True)
        return Response(serializer.data)

, которые дают правильный результат, но когда я пытаюсь написать ту же функциональность в дженериках. ListAPIView дает

TypeError в / api / v1 / contesty / 0b36d92a-51a7-4752-9df1-e5f2733116c1 / painting / объект типа 'method' не имеет len ()

class Contest_detail_by_id_category(generics.ListAPIView):

 
    serializer_class = ArtworkSerializer1(many=True)
    permission_classes = [AllowAny]
    
    def queryset(self):
 
        queryset = Artwork.objects.filter(artcontest = self.kwargs['id'],category__name__iexact=self.kwargs['category_name'])
     
        # queryset = self.get_queryset()
        serializer = ArtworkSerializer1(queryset)
        return Response(serializer.data)

Кто-нибудь может мне помочь - как написать правильное представление в generics.ListAPIView или viewsets.ModelViewSet

1 Ответ

0 голосов
/ 03 августа 2020

Удалить many=True из serializer_class. Создайте функцию get_queryset, как показано ниже, вместо функции queryset.

class Contest_detail_by_id_category(generics.ListAPIView):

    serializer_class = ArtworkSerializer1
    queryset = Artwork.objects.all()
    permission_classes = [AllowAny]
    
    def get_queryset(self):
        return self.queryset.filter(artcontest = self.kwargs['id'],category__name__iexact=self.kwargs['category_name'])
     

Обновление: Работает: класс ListAPIView наследует ListModelMixin.

class ListModelMixin:
    """
    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)

См. Здесь. https://github.com/encode/django-rest-framework/blob/master/rest_framework/mixins.py

...