Django rest framework Viewset для одного элемента, а не списка
У меня возникла проблема с моим DRF API. Я хочу предоставить конечную точку только для чтения, которая принимает один идентификатор от объекта (документа) в БД, запускает скрипт для выполнения проверки и возвращает результат. Это прекрасно работает, когда я вызываю API с помощью //api/documentcheck/1/, где 1 - это pk документа в БД. Проблема в том, что если я просто вызываю базовый URL //api/documentcheck/, он пытается вернуть результаты всех документов в базе данных и завершает работу, потому что это занимает много времени.
Я ищу способ убрать представление списка и заставить пользователей указывать ID для проверки одного документа.
Это мой класс сериализатора
class DocumentCheckSerializer(serializers.Serializer):
'''Serializer for document check'''
class Meta:
model = Document
fields = '__all__'
def to_representation(self, value):
return process_document(value)
Вот мое мнение:
class DocumentCheck(viewsets.ReadOnlyModelViewSet):
"""Check a single document"""
authentication_classes = (
TokenAuthentication,
SessionAuthentication,
BasicAuthentication,
)
permission_classes = [IsAuthenticated]
queryset = Document.objects.all()
serializer_class = serializers.DocumentCheckSerializer
и запись моего маршрутизатора
router.register("documentcheck", views.DocumentCheck, basename="documentcheck")
Вместо того, чтобы использовать viewsets.ReadOnlyModelViewSet
в качестве базового класса, используйте следующую установку
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
class DocumentCheck(
mixins.RetrieveModelMixin,
mixins.ListModelMixin,
GenericViewSet
):
"""Check a single document"""
authentication_classes = (
TokenAuthentication,
SessionAuthentication,
BasicAuthentication,
)
permission_classes = [IsAuthenticated]
queryset = Document.objects.all()
serializer_class = serializers.DocumentCheckSerializer
Вы можете использовать только GenericViewSet
и RetrieveModelMixin
в качестве базового класса
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import RetrieveModelMixin
class DocumentCheck(GenericViewSet, RetrieveModelMixin):
"""Check a single document"""
authentication_classes = (
TokenAuthentication,
SessionAuthentication,
BasicAuthentication,
)
permission_classes = [IsAuthenticated]
queryset = Document.objects.all()
serializer_class = serializers.DocumentCheckSerializer