Отфильтруйте pk, который находится перед url_path в ListApiView. Джанго

#python-3.x #django #django-rest-framework

Вопрос:

У меня есть urlpatterns = [path('collection/<int:pk>/video/', CollectionVideoViewSet.as_view(),name='collection-videos')] .

И ListAPIView :

 class CollectionVideoViewSet(ListAPIView):

    """ViewSet for operation with videos in collection"""
    permission_classes = (IsAuthenticated,)
    queryset = Video.objects.all()
    serializer_class = CollectionVideoSerializer
 

Могу ли я отфильтровать набор запросов в этом представлении по pk ?

Итак, я хочу, чтобы в выходных данных было количество, следующие, предыдущие поля

Ответ №1:

Вам нужно переопределить get_queryset метод:

 class CollectionVideoViewSet(ListAPIView):
    """ViewSet for operation with videos in collection"""
    permission_classes = (IsAuthenticated,)
    queryset = Video.objects.all()
    serializer_class = CollectionVideoSerializer

    def get_queryset(self):
        # Assuming your `Video` model has a many-to-one relation to `Collection`
        return self.queryset.filter(
            collection__pk=self.kwargs['pk']
        )
 

Чтобы ваше представление возвращало результат с разбивкой по страницам, т. е. количество, следующий, предыдущий, вам необходимо определить a pagination_class в своем представлении:

 from rest_framework.pagination import PageNumberPagination

class CollectionVideoViewSet(ListAPIView):
    pagination_class = PageNumberPagination
 

Подробнее о разбиении на страницы в DRF

Ответ №2:

Да, переопределите метод get_queryset для ListAPIView

 class TeamList(generics.ListAPIView):
    serializer_class = TeamSerializer

    def get_queryset(self, *args, **kwargs):
        sc = EmployeeSearchCriteria(email=self.kwargs["email"], role=Employee.VIEWER)
        return EmployeeCalculatorService().get_team_by_employee(sc)
 

Комментарии:

1. в этой ситуации будут ли у меня поля «количество», «следующий», «предыдущий» в возвращаемой информации?

2. да, это делается с помощью разных методов, которые вы не переопределяете