Отображение полей на основе запроса в сериализаторе 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)

Это должно работать нормально.

Вернуться на верх