Предполагая, что вы использовали StringRelatedField
в вашем MovieSerializer
следующим образом:
class MovieSerializer(serializers.ModelSerializer):
genre = serializers.StringRelatedField(many=True)
class Meta:
model = Movie
fields = [
'popularity',
'director',
'genre',
'imdb_score',
'name',
]
результат будет выглядеть следующим образом при получении списка фильмов:
[
{
"popularity": 83.0,
"director": "Victor Fleming",
"genre": [
"Adventure",
"Family",
"Fantasy",
"Musical"
],
"imdb_score": 8.3,
"name": "The Wizard of Oz"
}
]
Ноесли вы хотите создать новый фильм, он не будет работать, потому что StringRelatedField
только для чтения.
Однако вы можете создать собственное связанное поле.
Это полное serializers.py
:
from rest_framework import serializers
from .models import Genre, Movie
class GenreRelatedField(serializers.RelatedField):
def display_value(self, instance):
return instance
def to_representation(self, value):
return str(value)
def to_internal_value(self, data):
return Genre.objects.get(name=data)
class MovieSerializer(serializers.ModelSerializer):
genre = GenreRelatedField(
queryset=Genre.objects.all(),
many=True
)
class Meta:
model = Movie
fields = (
'popularity',
'director',
'genre',
'imdb_score',
'name',
)
Это простой пример, который можно настраивать различными способами.
Метод display_value
определяет способ отображения жанра объекта.например в виде.Здесь он просто возвращает объект Genre, т.е. вывод __str__
.
Метод to_representation
определяет, как объект Genre отображается в выводе (JSON или XML).Это очень похоже на предыдущий метод, но здесь мы явно должны преобразовать жанр в строку.Конечно, вы можете создать более сложный вывод в соответствии с вашими требованиями.
Метод to_internal_value
решает вашу реальную проблему путем получения жанра объекта для данного значения.Если у вас есть более сложный метод to_representation
, вам потребуется расширенная логика для получения соответствующего объекта.
Используя этот подход, вы можете опубликовать JSON в желаемой форме, указав имена жанров вместо их идентификаторов.
Надеюсь, этот пример поможет и другим людям.