django post метод создания записи с помощью ListApiView - PullRequest
0 голосов
/ 05 мая 2020

Я новичок в django rest-framework и пытаюсь создать новую запись, используя метод POST в ListAPIView.

Вот мой сериализатор:

from scheme.models import ProjectScheme, ProjectSchemeMaster
from rest_framework import serializers

class SchemeDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProjectScheme
        fields = ('id', 'name', 'parent_scheme_id', 'rule', 'created_on', 'created_by', 'updated_on','updated_by')
        depth=1

И view:

class ProjectSchemeList(ListAPIView):
"""
List all Schemes
"""
serializer_class = SchemeDetailSerializer
# pagination_class = ProjectLimitOffsetPagination

def get_queryset(self, *args, **kwargs):
    comp_logger.info('invoked scheme list all')
    schemes = ProjectScheme.objects.all().order_by('-id')
    return schemes

def post(self, request, *args, **kwargs):
    if serializer_class.is_valid():
        serializer_class.save()
        return Response(serializer_class.data, status=status.HTTP_201_CREATED)
    return Response(serializer_class.errors, status=status.HTTP_400_BAD_REQUEST)

Я получаю эту ошибку:

NameError at /scheme/schemes/
name 'serializer_class' is not defined

Как передать данные запроса в serializer_class?

1 Ответ

2 голосов
/ 05 мая 2020

Созданная функция включена по умолчанию в CreateAPIView generi c view, или, если вы хотите предоставить список и создать функциональность, вы можете использовать ListCreateAPIView , который предоставляет и то, и другое. Подробнее об общих c просмотрах DRF * здесь .

class ProjectSchemeList(ListCreateAPIView):

    serializer_class = SchemeDetailSerializer

    def get_queryset(self, *args, **kwargs):
        comp_logger.info('invoked scheme list all')
        schemes = ProjectScheme.objects.all().order_by('-id')
        return schemes

С этим определением вам не нужно будет вручную писать метод публикации.

Если вы хотите вручную определить метод публикации, вы можете изучить, как он написан в generi c CreateAPIView , и скопировать его, это немного отличается от того, как вы хотите его написать. Наконец, следующая ваша версия метода post с исправленными ошибками:

class ProjectSchemeList(ListAPIView):
    serializer_class = SchemeDetailSerializer

    def get_queryset(self, *args, **kwargs):
        comp_logger.info('invoked scheme list all')
        schemes = ProjectScheme.objects.all().order_by('-id')
        return schemes

    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Обратите внимание, как мы используем self.serializer_class (data = request.data) вместо просто serializer_class

...