首页 > 解决方案 > DRF Viewset 自定义“创建”方法不调用序列化程序自定义“创建”方法

问题描述

参考下面的代码。我想要实现的是在创建“答案”时创建一个新的“调查”实例。发送的 POST 请求是:{"choice":123}

第一个问题:“调查”:[“此字段为必填项。” ]。从序列化器字段中删除“调查”可以解决这个问题,但我不确定这是正确的。请注意,“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

标签: pythondjangodjango-rest-framework

解决方案


你应该使用viewsets.ModelViewSet而不是viewsets.ViewSet

然后声明serializer_class = AnswerSerializer使create方法工作。

This field is required是来自 Django 模型而不是 djangorestframework 的错误。你必须在方法上做一些技巧create来传递它。


推荐阅读