Избегайте различных представлений одного и того же сериализатора. 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', ...)