Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django REST嵌套对象序列化程序_Python_Django_Django Rest Framework - Fatal编程技术网

Python Django REST嵌套对象序列化程序

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"

我有如下设置的当前api,我的目的是使其显示所需的输出。我想添加年龄和国籍,如下图所示。查看嵌套类型的期望输出,但它似乎只以直接格式显示,而不是嵌套。使其嵌套的最佳方法是什么

  "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_表示。