Изменение поля модели django на сериализаторе
у меня есть определение модели
Class Book():
name = textfield()
edition = textfield()
я хочу, чтобы название книги было "название издания", если в объекте book есть данные об издании. в противном случае я хочу вернуть только книгу. как я могу этого добиться? могу ли я использовать serializermethod в сериализаторе book как
class BookSerializer(
):
name = serializers.SerializerMethodField()
def get_name(self,book):
if book.edition:
return f"{book.edition}{book.name}"
return book.name
<<<Я не хочу сохранять номер издания вместе с названием. Я просто хочу, чтобы сериализатор возвращал поле name как "название издания", если есть издание, иначе только название, но не сохранял его в модели.
Возможно, это не самый лучший способ, но именно так я это делал.
Переопределяя функцию to_representation
, вы можете изменить только сериализованный результат.
как так
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ('name', 'edition')
def to_representation(self, instance:Book):
out = super().to_representation(instance)
# change the name to <name edition>
out['name'] = f"{instance.edition if instance.edition else ""} {instance.name}"
# remove the original 'edition' so it doesnt show in output
out.pop('edition')
Таким образом, при сериализации bool obj вы получите только поле 'name', содержащее "{edition} {name}", но вы все равно сможете использовать этот сериализатор для десериализации и создания Book obj позже.