Отображение полей на основе запроса в сериализаторе django-rest-framework
В моем проекте Django есть модель Post. Я хочу отображать поле description
, когда пользователь получает список постов, а когда он получает экземпляр поста, вместо него отображать поле body
. (Оба поля существуют отдельно в модели)
вот мой сериализатор Post:
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ['id', 'title', 'image', 'description', 'slug']
lookup_field = 'slug'
вот мое мнение:
class posts(viewsets.ModelViewSet):
queryset = Post.published.all()
serializer_class = PostSerializer
lookup_field = 'slug'
Я хочу, чтобы когда пользователь получает список постов в /posts/
url, он видел что-то вроде этого:
[
{
"id": 31,
"title": "hello-world",
"image": { ... },
"description": "post description",
"slug": "hello-world"
},
...
]
и когда получаем экземпляр поста, видим что-то вроде этого с дополнительным полем body
и исключаем поле description
:
{
"id": 31,
"title": "hello-world",
"image": { ... },
"body": "post body ...",
"slug": "hello-world"
}
Я бы предложил вам использовать разные сериализаторы, Будет лучше иметь логическое разделение между различными требованиями
class PostListSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ['id', 'title', 'image', 'description', 'slug']
<...other attributes here ..>
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ['id', 'title', 'image', 'body', 'slug']
< ...other_attributes_here.. >
вы можете изменить свой набор представлений для выбора сериализатора на основе действия
class Posts(viewsets.ModelViewSet):
queryset = Post.published.all()
serializer_class = PostSerializer
lookup_field = 'slug'
def get_serializer_class(self):
serializer_map = {
'retrieve': PostSerializer,
'list': PostListSerializer
}
return serializer_map.get(self.action, PostSerializer)
Это должно работать нормально.