Python Django REST嵌套对象序列化程序
我有如下设置的当前api,我的目的是使其显示所需的输出。我想添加年龄和国籍,如下图所示。查看嵌套类型的期望输出,但它似乎只以直接格式显示,而不是嵌套。使其嵌套的最佳方法是什么Python Django REST嵌套对象序列化程序,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有如下设置的当前api,我的目的是使其显示所需的输出。我想添加年龄和国籍,如下图所示。查看嵌套类型的期望输出,但它似乎只以直接格式显示,而不是嵌套。使其嵌套的最佳方法是什么 "type" : [ { "age" : "27", "nationality" : "usa" } 当前API [ { "name" : "Jay", "school" : "college", "type" : "usa" "age": "27"
"type" : [
{ "age" : "27", "nationality" : "usa" }
当前API
[
{
"name" : "Jay",
"school" : "college",
"type" : "usa"
"age": "27"
"nationality": "usa"
},
]
所需的API
[
{
"name" : "Jay",
"school" : "college",
"type" : [
{ "age" : "27", "nationality" : "usa" },
{ "age" : "24", "nationality" : "canada" },
{ "age" : "26", "nationality" : "thailand" },
]
}
]
序列化程序.py
class SchoolSerializer(serializers.ModelSerializer):
class Meta:
model = School
fields = ("name", "school", "type", "age", "nationality")
def update(self, instance, validated_data):
instance.name = validated_data.get("name", instance.name)
instance.school = validated_data.get("school", instance.session)
instance.type = validated_data.get("type", instance.session)
instance.age = validated_data.get("age", instance.session)
instance.nationality = validated_data.get("nationality", instance.session)
instance.save()
return instance
models.py
class School(models.Model):
name = models.CharField(max_length=255, null=False)
school = models.CharField(max_length=255, null=False)
type = models.CharField(max_length=255, null=False)
age = models.CharField(max_length=255, null=False)
nationality = models.CharField(max_length=255, null=False)
def __str__(self):
return "{} - {}".format(self.name, self.school)
views.py
class ListSchoolView(generics.ListCreateAPIView):
"""
Provides a get method handler.
"""
queryset = School.objects.all()
serializer_class = SchoolSerializer
如果要自定义模型序列化的方式,请重写序列化程序的to_表示方法。这似乎与RESTAPI设计背道而驰,所以我不推荐它。您应该为TypeSerializer创建一个单独的序列化程序,以获得最佳结果 将此方法添加到SchoolSerializer以实现所需的格式:
def to_representation(self, obj):
rep = super().to_representation(obj)
age = rep.pop('age')
type_ = rep.pop('type')
rep['type'] = {
'age': age,
'nationality': type_
}
return rep
我昨天回答了这个问题,但你删除了这个问题。你应该继续讨论这个问题。如果你想获得你想要的格式,类型必须有自己的序列化程序。TypeSerializer将有年龄和国籍字段,正如我在这里解释的:您的学校序列化程序是SupervisorSerializer,TypeSerializer将类似于ManagerSerializer。如果您希望按当前的状态接收输入,但在检索记录时只希望使用不同的格式,那么请自定义检索视图。我希望接收输入所需的api格式。我在API格式中添加了更多内容。您的代码似乎不起作用。你能在这里转载吗?这不是从销售代表那里冒出来的,并以那种格式发布的吗?我想从终端用户那里获取该格式的api。这仅用于表示。不会影响用户输入。而且,类型和国籍字段似乎是重复的。我正在寻找最好的方法。如果这不符合设计要求,您还建议采用什么其他方法?您的模型格式不正确。您应该为学校类型使用单独的表格。您可以使用TypeSerializer,但即使如此,您也必须重写_表示以填充它以进行读取。我不希望只重写to_表示。