Поля вложенных сериализаторов

В моем вложенном сериализаторе я хочу показать только название фильма и исключить другие поля

[
    {
        "id": 2,
        "watchlist": [
            {
                "id": 3,
                "platform": "Netflix",
                "title": "Martian",
                "storyline": "A lost astronaut of Mars survived",
                "average_rating": 4.1,
                "total_rating": 2,
                "active": true,
                "created": "2022-04-05T05:37:35.902464Z"
            },
            {
                "id": 4,
                "platform": "Netflix",
                "title": "Intersteller",
                "storyline": "Finding new home",
                "average_rating": 0.0,
                "total_rating": 0,
                "active": true,
                "created": "2022-04-06T04:52:04.665202Z"
            },
            {
                "id": 5,
                "platform": "Netflix",
                "title": "Shutter Island",
                "storyline": "Psycopath",
                "average_rating": 0.0,
                "total_rating": 0,
                "active": true,
                "created": "2022-04-06T04:52:51.626397Z"
            }
        ],
        "platform": "Netflix",
        "about": "streaming, series and many more",
        "website": "https://www.netflix.com"
    },
    
]

В приведенных выше данных, "watchlist" - это вложенные данные сериализатора. Я хочу показать только "title" и исключить все остальные данные

Я включил класс WatchListSerializer как "вложенный" сериализатор в класс StreamPlatformSerializer. Я хочу, чтобы на "title должен быть показан, остальные поля должны быть исключены из части вложенного сериализатора"

ниже приведен код...

class WatchListSerializer(serializers.ModelSerializer):
    # reviews = ReviewSerializer(many=True, read_only=True)
    platform = serializers.CharField(source='platform.platform')
    class Meta:
        model = WatchList
        fields = '__all__'

    # def to_representation(self, value):
    #     return value.title


class StreamPlatformSerializer(serializers.ModelSerializer):
    watchlist = WatchListSerializer(many=True, read_only=True)
    # watchlist = serializers.CharField(source='watchlist.title')
    class Meta:
        model = StreamPlatform
        fields = '__all__'

после удаления других полей он должен выглядеть так, как показано ниже...

[
    {
        "id": 2,
        "watchlist": [
            {
              
                "title": "Martian"
            },
            {
                "title": "Intersteller",
                
            },
            {
                
                "title": "Shutter Island",
                
        ],
        "platform": "Netflix",
        "about": "streaming, series and many more",
        "website": "https://www.netflix.com"
    },
    
]

Для этого может быть два подхода Первый подход:

class WatchListSerializer(serializers.ModelSerializer):
    # reviews = ReviewSerializer(many=True, read_only=True)
    class Meta:
        model = WatchList
        fields = ("title",)

    # def to_representation(self, value):
    #     return value.title


class StreamPlatformSerializer(serializers.ModelSerializer):
    watchlist = WatchListSerializer(many=True, read_only=True)
    # watchlist = serializers.CharField(source='watchlist.title')
    class Meta:
        model = StreamPlatform
        fields = '__all__'

При таком подходе недостатком будет то, что WatchListSerializer можно будет использовать только в этом сериализаторе, а не как отдельный сериализатор.

Для второго подхода мне нужно увидеть ваши модели. Это было бы похоже на

class StreamPlatformSerializer(serializers.ModelSerializer):
    watchlist = serializers.SerializerMethodField("get_watchlist")
    class Meta:
        model = StreamPlatform
        fields = '__all__' # include watchlist as well
        
    def get_watchlist(self, obj):
        return obj.watchlist.all().values('title')

Лично мне такой подход нравится.

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