Django rest сериализует поле с различным типом данных чтения и записи - PullRequest
0 голосов
/ 28 мая 2018

Я использую django rest с neo4j.Для моего проекта при создании узла я получу список идентификаторов для узлов, к которым будет относиться текущий узел.Для представления я представлю список диктов, которые содержат данные узлов, подключенных к этому узлу.Но из-за сериализатора, который является списком строк, dicts преобразуется в строку.

Моя проблема не в 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

1 Ответ

0 голосов
/ 28 мая 2018

Сериализатор пользовательского вопроса можно использовать следующим образом:

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'].

...