如何使用 Serializer 制作对象原始字段的简单列表

How to make a simple list of primitive fields of object with Serializer

我正在为我的客户使用 Django Rest Framework 创建 Rest API,但在创建它的结构时我感到很困惑。我想要这样的结构 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

它returns:

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

我能做什么?我尝试使用 ListSerializer 等。但是,不幸的是,所有这些都没有用。

Python 3DRF

尝试在序列化程序中返回一个列表:

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)

有多种解决方案。其中之一是使用 SlugRelatedField.

根据文档:

SlugRelatedField may be used to represent the target of the relationship using a field on the target.

对于我的情况,它看起来像:

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 必需的 。它将 return 相同的结果

您还可以传递一个queryset作为相关字段的参数。