Избегайте различных представлений одного и того же сериализатора. Django Rest Framework

Представьте, что у меня есть модель, которая выглядит следующим образом:

class Author(models.Model):

    books = models.ManyToManyField()

и сериализатор для объектов Book:

class BookSerializer(serializers.ModelSerializer):

    class Meta:
        model = Book
        fields = ('title',)

    def to_representation(self, obj):
        return obj.title

Я использую его для представления объектов Book для сущностей Author. У меня есть два разных сериализатора для GET и POST запросов, но поле books абсолютно одинаковое.

class AuthorSerializer(serializers.ModelSerializer):

    books = BookSerializer(read_only=True, many=True)

    class Meta:
        model = Author
        fields = ('books', ...)

Моя проблема в том, что один AuthorSerializer (GET запросы) возвращает данные корректно:

books = ['...', '...']

в то время как тот, который предназначен для POST-запросов, возвращает его с идентификаторами.

books = [{'id': 1, 'title': '...'}]

Что я упускаю? Спасибо.

попробуйте добавить следующую строку в мета-класс BookSerializer.

exclude=('id',)

Я думаю, что ваш сериализатор Book неоднозначен, потому что он имеет to_representation метод и список объявленных полей для сериализации, и эти два противоречат друг другу. Использование метода вместо метода может решить эту проблему:

class AuthorSerializer(serializers.ModelSerializer):

    books = serializers.SerializerMethodField(read_only=True)

    def get_books(self, obj: Author):
        return obj.books.all().values_list('title', flat=True)

    class Meta:
        model = Author
        fields = ('books', ...)
Вернуться на верх