DRF Viewset пользовательский метод "create" не вызывает сериализатор пользовательский метод "create" - PullRequest
0 голосов
/ 15 октября 2018

со ссылкой на код ниже.Я пытаюсь создать новый экземпляр «Survey» при создании «Answer».Отправленный запрос POST: {"choice":123}

Первая проблема: «survey»: [«Это поле обязательно для заполнения».].Удаление «опроса» из полей сериализатора обходит это, но я не уверен, что это правильно.Обратите внимание, что и «Survey», и «Choice» имеют отношение «один ко многим» с «Answer» по внешнему ключу.

Вторая проблема: пользовательский метод создания в сериализаторе не вызывается, поскольку тестовая печать «HELLO»"Я вставил не выполнено и ничего не создано.

Застряли на это какое-то время, какие-нибудь идеи, ребята?Очень ценю это.

class AddAnswerView(viewsets.ViewSet):

    def create(self, request, *args, **kwargs):
        data = request.data.get(
            "items") if 'items' in request.data else request.data
        many = isinstance(data, list)
        serializer = AnswerSerializer(data=data, many=many)
        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)

class SurveySerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Survey
        fields = ('id',)

    def create(self, validated_data):
        return models.Survey.objects.create(**validated_data)


class AnswerSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Answer
        fields = ('choice', 'survey')

    def create(self, validated_data):
        print('HELLO')
        user = self.context['request'].user
        new_survey = models.Survey.objects.create(user=user)
        answer = models.Answer.objects.create(survey=new_survey, 
          **validated_data)
        return answer

1 Ответ

0 голосов
/ 15 октября 2018

Вы должны использовать viewsets.ModelViewSet вместо viewsets.ViewSet

Затем объявите serializer_class = AnswerSerializer, чтобы заставить работать метод create.

This field is required - это ошибка из Django Model, а не djangorestframework.Вы должны сделать несколько трюков в методе create для его передачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...