Как вложить два сериализатора с одинаковой моделью - PullRequest
0 голосов
/ 29 августа 2018

У меня два сериализатора с одинаковой моделью. Я хочу их вложить.

К сожалению, этот подход не работает:

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['name', 'word_count']


class BetterBookSerializer(serializers.ModelSerializer):
    book = BookSerializer(many=False)

    class Meta:
        model = Book
        fields = ('id', 'book')

Ожидаемый результат:

{
  "id": 123,
  "book": {
    "name": "book_name",
    "word_count": 123
  }
}

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Используйте source=* вместо many=True как

class BetterBookSerializer(serializers.ModelSerializer):
    book = BookSerializer<b>(source='*')</b>

    class Meta:
        model = Book
        fields = ('id', 'book')

Из документа ,

Значение source='*' имеет особое значение и используется для указания того, что весь объект должен быть передан в поле. Это может быть полезно для создания вложенных представлений или для полей, которым требуется доступ ко всему объекту для определения выходного представления.

0 голосов
/ 29 августа 2018

Вы можете получить желаемый результат следующим образом:

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['name', 'word_count']

class BetterBookSerializer(serializers.ModelSerializer):
    book = serializers.SerializerMethodField(read_only=True)

    class Meta:
         model = Book
         fields = ('id', 'book')

    def get_book(self, obj):
         return BookSerializer(obj).data

Небольшое обновление: Хотя мой подход к решению вашей проблемы работает просто отлично, ответ @JPG с упоминанием опции source='*' - хороший путь. Таким образом, вы можете легко использовать вложенный сериализатор при создании нового объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...