【问题标题】:Django rest serialize a field with diffrent read and write data typeDjango rest序列化具有不同读写数据类型的字段
【发布时间】:2018-11-06 15:09:30
【问题描述】:

我使用 django rest 和 neo4j。对于我的项目,在创建节点时,我将获得当前节点将与其相关的节点的 ID 列表。为了表示,我将表示包含连接到该节点的节点数据的字典列表。但是因为序列化器是字符串列表,所以字典会转换成字符串。

我的问题不在于 neo4j。我要求在 django rest 中使用不同的数据类型序列化同一字段的读写。

这是我的代码:

class ScreenSerializer(serializers.Serializer):
    questions = serializers.ListSerializer(child=serializers.CharField())

    def create(self, validated_data):
        questions = validated_data.pop('questions')
        screen = Screen(**validated_data).save()
        for question_uid in questions:
            # connect relation in neo4j between screen and questions
        screen.save()
        return screen

    def to_representation(self, obj):
        obj.questions = # List of dicts that contain every connected node data
        obj = super().to_representation(obj)
        return obj

我尝试了 read_only、write_only 但这对我没有帮助。

输入示例:['123456', '654321']

输出示例:[{some data of node 123456},{some data of node 654321}]

但我目前的输出是这样的:['{some data of node 123456}', '{some data of node 654321}']

编辑:

neverwalkaloner 的工作基础答案:

    def to_representation(self, obj):
        obj.questions = # List of dicts that contain every connected node data
        self.fields['questions'] = serializers.ListSerializer(child=serializers.DictField())
        obj = super().to_representation(obj)
        return obj

【问题讨论】:

    标签: django python-3.x neo4j django-rest-framework


    【解决方案1】:

    您可以像这样使用自定义问题的序列化程序:

    class QuestionSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Question
            fields = ['field1', 'field2']
    
    class ScreenSerializer(serializers.Serializer):
    
        def create(self, validated_data):
            questions = validated_data.pop('questions')
            screen = Screen(**validated_data).save()
            for question_uid in questions:
                # connect relation in neo4j between screen and questions
            screen.save()
            return screen
    
        def to_representation(self, obj):
            self.fields['questions'] = QuestionSerializer(many=True)
            return super().to_representation(obj)
    

    注意在to_representation 方法中,您应该覆盖序列化程序的字段问题。您可以通过self.fields['questions'] 语法访问它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-20
      • 2020-09-29
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 2019-10-26
      • 2017-03-26
      • 1970-01-01
      相关资源
      最近更新 更多