Оптимизация получения первой записи в таблице с помощью конечной точки API с помощью Django REST Framework и/или Django-filter

Я пытаюсь получить первую запись в таблице, используя конечную точку ниже (пожалуйста, подскажите, если есть более разумное соглашение URL).

http://127.0.0.1:8000/api/review/?first

Представление, которое у меня есть, работает, но я надеюсь его рефакторить, потому что оно пахнет.

class ReviewViewSet(ModelViewSet):
    filter_backends = (DjangoFilterBackend, OrderingFilter)
    serializer_class = ReviewSerializer
    permission_classes = [permissions.IsAuthenticated]

    def get_queryset(self):
        first = self.request.query_params.get('first')
        queryset = RecordReview.objects.all()

        if first is not None:
            id_list = queryset.values_list('id')
            first_item = id_list.order_by('id').first()
            first_id = first_item[0]
            queryset = queryset.filter(id=first_id)

        return queryset

Когда я пытался фильтровать набор запросов напрямую, я получал ошибки типа:

TypeError: object of type 'RecordReview' has no len()

Ошибка возникает из-за этой строки :

first_id = first_item[0]

Это происходит потому, что first_item уже является RecordReview, поскольку он был получен с помощью first()

Вы можете упростить get_queryset следующим образом :

class ReviewViewSet(ModelViewSet):
    filter_backends = (DjangoFilterBackend, OrderingFilter)
    serializer_class = ReviewSerializer
    permission_classes = [permissions.IsAuthenticated]

    def get_queryset(self):
        first = self.request.query_params.get('first')
        queryset = RecordReview.objects.all()

        if first is not None:
            queryset = queryset.order_by('id')[:1]

        return queryset
Вернуться на верх