Оптимизация получения первой записи в таблице с помощью конечной точки 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