繁体   English   中英

Django Rest使用可写的嵌套序列化器创建

[英]Django Rest Create with a Writable Nested Serializer

我正在尝试使用可写的嵌套序列化程序在Django Rest Framework中执行创建。

使用下面的代码,我可以创建一个ScriptQuestion,但不能在其中添加RecordedInterview。 Django说OrderedDict为None。

我究竟做错了什么?

提前致谢

#models.py

class ScriptQuestion(models.Model):
    interview = models.ManyToManyField(RecordedInterview)
    ...

class RecordedInterview(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    ...

序列化器

#serializers.py

class InterviewTitleSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = RecordedInterview
        fields = ('id', 'title')
        extra_kwargs = {
            'title': { 'read_only': True }
        }


class QuestionDetailSerializer(serializers.HyperlinkedModelSerializer):

    interview = InterviewTitleSerializer(many=True)

    class Meta:
        model = ScriptQuestion
        fields = ('id', 'title', 'prep_time', 'answer_time', 'interview')
        depth = 1

    def create(self, validated_data):
        interview_data = validated_data.pop('interview')
        question = ScriptQuestion.objects.create(**validated_data)
        for item in interview_data:
            item = interview_data['id']
            question.interview.add(item)
        return question

这是我的看法

#views.py 

class CreateQuestion(generics.CreateAPIView):
    queryset = ScriptQuestion.objects.all()
    serializer_class = QuestionDetailSerializer

和json

{
    "title": "Question Test Json",
    "prep_time": "1",
    "answer_time":"1",
    "interview": [
           {
                "id": "a450aeb0-8446-47b0-95bd-5accbb8b4afa"
            }
     ]
}

如果我手动进行操作,则可以将RecordedInterview添加到ScriptQuestion中:

#serializers.py 

def create(self, validated_data):
    interview_data = validated_data.pop('interview')
    question = ScriptQuestion.objects.create(**validated_data)
    item = 'a450aeb0-8446-47b0-95bd-5accbb8b4afa'
    question.interview.add(item)
    return question

由于声誉低下,我无法添加评论。 所以添加作为答案。 我认为您应该使用“ serializers.ModelSerializer”而不是“ serializers.HyperLinkedModelSerializer”

哦,我能做到。

对于将来的某个人,只需在序列化器中添加“ id = serializers.CharField()”

class InterviewTitleSerializer(serializers.ModelSerializer):
    id = serializers.CharField()

    class Meta:
        model = RecordedInterview
        fields = ('id', 'title')
        extra_kwargs = {'title': { 'read_only': True }}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM