Как составить простой список примитивных полей объекта с помощью Serializer - PullRequest
0 голосов
/ 28 января 2020

Я создаю Rest API с Django Rest Framework для моих клиентов, и я запутался при создании его структуры. Мне нужна такая структура с DRF Serializers:

[
    {
        "id": 1,
        "name": "Alan",
        "toys": [
            "Robocop",
            "Ninja",
            "Megalodon"
        ]
    },
    {
        "id": 2,
        "name": "John",
        "toys": [
            "Avatar",
            "Donatello Turtle",
            "Super Mario"
        ]
    },
]

Мои сериализаторы выглядят так:

class GoodBoyToysSerializer(serializers.Serializer):
    name = serializers.CharField()


class GoodBoysSerializer(serializers.ModelSerializer):
    toys = serializers.SerializerMethodField()

    def get_toys(self, good_boy):
        queryset = Toy.objects.filter(good_boy=good_boy)
        serializer = GoodBoyToysSerializer(queryset, many=True)
        return serializer.data

Возвращает:

[
    {
        "id": 1,
        "name": "Alan",
        "toys": [
            { "name": "Robocop" },
            { "name": "Ninja" },
            { "name": "Megalodon" },
        ]
    },
    {
        "id": 2,
        "name": "John",
        "toys": [
            { "name": "Avatar" },
            { "name": "Donatello" },
            { "name": "Super Mario" },
        ]
    },
]

Что я могу сделать ? Я пытался использовать ListSerializer и т. Д. c. Но, к сожалению, все это бесполезно.

Python 3, DRF

Ответы [ 2 ]

1 голос
/ 28 января 2020

Попробуйте вернуть список в ваш сериализатор:

class GoodBoysSerializer(serializers.ModelSerializer):
    toys = serializers.SerializerMethodField()

    def get_toys(self, good_boy):
        queryset = Toy.objects.filter(good_boy=good_boy)
        return queryset.values_list('name', flat=True)
0 голосов
/ 28 января 2020

Возможно с несколькими решениями. Один из них использует SlugRelatedField.

Согласно документации:

SlugRelatedField может использоваться для представления цели отношения с использованием поля на цели.

Для моего случая это будет выглядеть так:

class GoodBoysSerializer(serializers.ModelSerializer):
    toys = serializers.SlugRelatedField(
        read_only=True,
        many=True,
        slug_field='name'
    )

    class Meta:
        model = GoodBoy
        fields = ['id', 'name', 'toys']

, где slug_field - это , требуется . И он вернет тот же результат

Вы также можете передать queryset в качестве параметра для связанного поля.

...