DRF Viewset自定义“创建”方法不调用序列化程序自定义“创建”方法

时间:2018-10-15 03:42:41

标签: python django django-rest-framework

参考下面的代码。 我要实现的目的是在创建“答案”时创建一个新的“调查”实例。 发送的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

1 个答案:

答案 0 :(得分:0)

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

然后声明serializer_class = AnswerSerializer以使create方法起作用。

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