Удалить ключи из массива в django rest framework serializer - PullRequest
0 голосов
/ 25 сентября 2018

Рассмотрим ответ json от одной из моих конечных точек в веб-приложении django rest Framework.

{
"links": {
    "next": null,
    "previous": null
},
"count": 2,
"total_pages": 1,
"results": [
    {
        "movie": {
            "id": 13,
            "title": "Living Doll",
            "genres": [
                {
                    "genre": "Horror"
                }
            ],
            "imdbID": "tt0100038",
            "poster": "/8VUR5PN3yqRoK9M65BASDrZ4Imd.jpg",
            "language": "en",
            "favourite": false,
            "watch_later": true,
            "watched": false
        }
    },
    {
        "movie": {
            "id": 230,
            "title": "Porno",
            "genres": [
                {
                    "genre": "Romance"
                },
                {
                    "genre": "Comedy"
                }
            ],
            "imdbID": "tt0100388",
            "poster": "/dNkLerizbd53flidKiippvBTns4.jpg",
            "language": "pl",
            "favourite": true,
            "watch_later": true,
            "watched": false
        }
    }
]

}

См. Избыточный ключ фильма в каждом элементе массива.Как мне удалить их, чтобы сделать это так?

{
"links": {
    "next": null,
    "previous": null
},
"count": 2,
"total_pages": 1,
"results": [
        {
            "id": 13,
            "title": "Living Doll",
            "genres": [
                "Horror"
            ],
            "imdbID": "tt0100038",
            "poster": "/8VUR5PN3yqRoK9M65BASDrZ4Imd.jpg",
            "language": "en",
            "favourite": false,
            "watch_later": true,
            "watched": false
        },
       {
            "id": 230,
            "title": "Porno",
            "genres": [
                   "Romance",
                   "Comedy"
            ],
            "imdbID": "tt0100388",
            "poster": "/dNkLerizbd53flidKiippvBTns4.jpg",
            "language": "pl",
            "favourite": true,
            "watch_later": true,
            "watched": false
        }

]

}

Также смотрите жанры.Они должны быть похожи на второй json без ключей.

Сериализатор ответа jooboo приведен ниже

class MovieSerializer(serializers.ModelSerializer):

    genres = serializers.SerializerMethodField()
    favourite = serializers.SerializerMethodField()
    watch_later = serializers.SerializerMethodField()
    watched = serializers.SerializerMethodField()

    class Meta:
        model = Movie
        fields = ('id','title','genres','imdbID','poster','language','favourite','watch_later','watched')
        read_only_fields =('title','genres','imdbID' ,'poster','language')

    def get_genres(self, obj):
        qs = MovieGenre.objects.filter(movie=obj)
        return GenreSerializer(qs,many=True).data

    def get_favourite(self, obj):
        result = UserList.objects.filter(user=self.context.get('request').user,movie=obj)
        if result:
            return result[0].favourite
        return False

    def get_watch_later(self, obj):
        result = UserList.objects.filter(user=self.context.get('request').user,movie=obj)
        if result:
            return result[0].watch_later
        return False

    def get_watched(self, obj):
        result = UserList.objects.filter(user=self.context.get('request').user,movie=obj)
        if result:
            return result[0].watched
        return False

Это код вида

class MovieSearchView(generics.ListAPIView):
    pagination_class = StandardResultsSetPagination
    serializer_class = MovieSerializer
    filter_backends = (filters.SearchFilter,)
    search_fields = ('title',)
    queryset = Movie.objects.all()

1 Ответ

0 голосов
/ 25 сентября 2018

Для жанров: Вы можете использовать values_list.

Попробуйте это в get_genres:

def get_genres(self, obj):
    return MovieGenre.objects.filter(movie=obj).values_list('genre', flat=True)

Я предполагаю, что genre - это имя поля модели MovieGenre.

А для ключа фильма - как онов настоящее время в вашем вопросе - не должно быть никакого ключа фильма.Ваш сериализатор не имеет его.Поэтому я не могу понять, почему у вас есть вывод, если нет чего-то еще, что вы не включили.

Сериализатор должен создать список сериализованных объектов фильма.

Попробуйте удалить StandardResultsSetPagination и посмотрите,это правильно.

...