Я не могу получить поле через сериализатор в validation_data - PullRequest
0 голосов
/ 15 марта 2020

У меня проблема с пониманием того, как работает сериализатор, может быть, кто-то может помочь мне объяснить рабочий процесс. У меня есть следующий сериализатор:

import ast

from rest_framework import serializers
from .models import Speaker


class SpeakerSerializer(serializers.ModelSerializer):
    # title = serializers.SerializerMethodField('title')
    fullName = serializers.SerializerMethodField()

    class Meta:
        fields = ("id", "image", "fullName", "title")
        model = Speaker

    # def get_title(self, obj):
    #     return {'ro': obj.title_ro, 'ru': obj.title_ru, 'en': obj.title_en}

    def get_fullName(self, obj):
        return {'ro': obj.fullName_ro, 'ru': obj.fullName_ru, 'en': obj.fullName_en}

    def create(self, validated_data):
        print(validated_data)
        title = ast.literal_eval(validated_data.get('title')).get('en', None)
        title_ru = ast.literal_eval(validated_data.get('title')).get('ru', None)
        title_ro = ast.literal_eval(validated_data.get('title')).get('ro', None)
        fullName = ast.literal_eval(validated_data.get('fullName')).get('en', None)
        fullName_ru = ast.literal_eval(validated_data.get('fullName')).get('ru', None)
        fullName_ro = ast.literal_eval(validated_data.get('fullName')).get('ro', None)
        image = validated_data.get('image')
        speaker = Speaker(title=title, title_ro=title_ro, title_ru=title_ru, fullName=fullName, fullName_ro=fullName_ro,
                          fullName_ru=fullName_ru, image=image)
        speaker.save()
        return speaker

с почтальоном, которого я отправляю 'title' = {'ro': 'something', 'ru': 'something'} here is Postman screenshot, но когда я печатаю vlidated_data, я получаю только изображение без 'title', если я раскомментирую title = serializers.SerializerMethodField('title'). Я должен сказать, что без title = serializers.SerializerMethodField('title') fullName = serializers.SerializerMethodField() все работает нормально, но мне нужно это для пользовательского ответа, подобного этому

{
    "data": [
        {
            "id": 21,
            "image": null,
            "fullName": {
                "ro": "something",
                "ru": "something",
                "en": null
            },
            "title": {
                "ro": "something",
                "ru": "something",
                "en": null
            }
        }
    ],
    "meta": {
        "nextPage": null,
        "previousPage": null,
        "total": 1,
        "page": 1,
        "perPage": 10
    }
}
...