如何使用 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 3
、DRF
尝试在序列化程序中返回一个列表:
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
作为相关字段的参数。
我正在为我的客户使用 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 3
、DRF
尝试在序列化程序中返回一个列表:
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
作为相关字段的参数。