参考下面的代码。
我要实现的目的是在创建“答案”时创建一个新的“调查”实例。
发送的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
答案 0 :(得分:0)
您应该使用viewsets.ModelViewSet
而不是viewsets.ViewSet
然后声明serializer_class = AnswerSerializer
以使create
方法起作用。
This field is required
是来自Django模型的错误,不是djangorestframework。
您必须在create
方法中做一些技巧来传递它。