【问题标题】:Serializing ManyToMany in Django Rest Framework (2.3.5) throws ValueError在 Django Rest Framework (2.3.5) 中序列化 ManyToMany 抛出 ValueError
【发布时间】:2013-07-29 22:16:02
【问题描述】:

我有一个我认为是非常简单的序列化程序设置,但是当我尝试将数据放入我的 API 时,我收到以下错误:

ValueError: 实例应该是一个查询集或其他可迭代的 许多=真

这是视图:

class QuizAPI(generics.RetrieveUpdateDestroyAPIView):
    model = Quiz
    serializer_class = QuizSerializer
    lookup_field = 'activity_id'

和序列化器:

class MediaResourceSerializer(serializers.ModelSerializer):
    owner = serializers.PrimaryKeyRelatedField(many=False, read_only=True)

    class Meta:
        model = MediaResource
        fields = ('owner', 'name', 'type', 'url')

class AnswerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Answer
        fields = ('text','is_correct','order')

class QuestionSerializer(serializers.ModelSerializer):
    answers = AnswerSerializer(many=True, required=False)
    resources = MediaResourceSerializer(many=True, required=False)

    class Meta:
        model = Question
        fields = ( 
            'question_id', 
            'type', 
            'order', 
            'question_text', 
            'explanation', 
            'resources', 
            'grading_weight', 
            'answers' 
        )

class QuizSerializer(serializers.ModelSerializer):
    questions = QuestionSerializer(many=True, required=False)
    created_by = serializers.PrimaryKeyRelatedField(many=False, read_only=True)

    class Meta:
        model = Quiz
        fields = (
            'activity_id', 
            'name',  
            'is_hidden', 
            'created_by', 
            'created_date', 
            'last_updated', 
            'sharable', 
            'questions'
        )

如果我从 QuizSerializer 中注释掉“问题”字段,它运行得很好(当然没有问题数据)。

** 编辑: 这是 PUT 调用负载:

activity_id: 4
created_by: 1
created_date: "2013-07-29T20:39:47.981Z"
is_hidden: false
last_updated: null
name: "This is only a test"
questions: []
sharable: true

【问题讨论】:

  • 我从未解决过这个问题,但最终我的工作是只为我的应用序列化平面结构。

标签: python django rest serialization django-rest-framework


【解决方案1】:

问题看起来是嵌套表示do not support read–write,并且为写入操作序列化平面结构是要走的路。

【讨论】:

    【解决方案2】:

    对于模型之间的嵌套关系,在我看来,最好和最简单的方法是使用不同的序列化器

    我的情况

    class UserViewSet(viewsets.ModelViewSet):
        queryset = User.objects.all()
    
        def get_serializer_class(self):
            if self.request.method == 'GET':
                return GetUserModelSerializer
            else:
                return UserModelSerializer
    

    你的情况:

    class QuizAPI(generics.RetrieveUpdateDestroyAPIView):
        model = Quiz
        #serializer_class = QuizSerializer
        lookup_field = 'activity_id'
    
        def get_serializer_class(self):
            if self.request.method == 'GET':
                return QuizNestedSerializer
            else: # Means POST, PUT etc.
                return QuizSimpleSerializer
    
    class QuizSimpleSerializer(serializers.ModelSerializer):
        # remove these lines
        # questions = QuestionSerializer(many=True, required=False)
        # created_by = serializers.PrimaryKeyRelatedField(many=False, read_only=True)
    
        class Meta:
            model = Quiz
            fields = (
                'activity_id', 
                'name',  
                'is_hidden', 
                'created_by', 
                'created_date', 
                'last_updated', 
                'sharable', 
                'questions'
            )
    
    class QuizNestedSerializer(serializers.ModelSerializer):
        questions = QuestionSerializer(many=True, required=False)
        created_by = serializers.PrimaryKeyRelatedField(many=False, read_only=True)
    
        class Meta:
            model = Quiz
            fields = (
                'activity_id', 
                'name',  
                'is_hidden', 
                'created_by', 
                'created_date', 
                'last_updated', 
                'sharable', 
                'questions'
            )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-08
      • 2015-06-29
      • 2015-01-12
      • 2016-07-21
      • 2015-12-13
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多