如何在Django rest框架中为Json响应设计序列化器?

时间:2019-05-04 07:29:35

标签: json django django-rest-framework

您好,我是Django rest框架的新手。目前正在研究包含json响应的内容:

{
    "students": [
        {
            "first_name": <str: student first name>,
            "last_name": <str: student last name>,
            "unique_id": <str: student unique id>,
            "current_teachers": [
                {
                    "first_name": <str: teacher first name>,
                    "last_name": <str: teacher last name>
                },
                ...
            ]
        },
        ...more...
    ]
}

这是我的序列化器:

class StudentFilterSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = ("first_name", "last_name", "unique_id",)

class StudentFilterTeacherSerializer(serializers.ModelSerializer):
    first_name = serializers.CharField(source='teacher.first_name')
    last_name = serializers.CharField(source='teacher.last_name')

    class Meta:
        model = TeacherClass
        fields = ("teacher","first_name","last_name")

class FilterStudentsSerializer(serializers.Serializer):
    students = StudentFilterSerializer(many=True)
    current_teachers = StudentFilterTeacherSerializer(many=True, required=False)  

现在如何编辑我的序列化程序以实现json响应。 因为这是我当前的json结构:

serializer = FilterStudentsSerializer()
serializer.data
{'students': [], 'current_teachers': []}

1 个答案:

答案 0 :(得分:3)

如果我们可以看到您的模型是如何实现的,则提供正确答案会更容易。在不知道字段连接的情况下,我仍然会尝试

有两种解决方案:

第一

class StudentFilterTeacherSerializer(serializers.ModelSerializer):
    first_name = serializers.CharField(source='teacher.first_name')
    last_name = serializers.CharField(source='teacher.last_name')

    class Meta:
        model = TeacherClass
        fields = ("first_name","last_name")


class StudentFilterSerializer(serializers.ModelSerializer):
    current_teachers = SerializerMethodField(required=False)
    class Meta:
        model = Student
        fields = ("first_name", "last_name", "unique_id", "current_teachers")

    def current_teachers(self, student):
        # Get all teachers for this student
        # I don't know how your models are created but you'll get the idea
        # assuming you have "related_name" setup between student and teachers
        teachers = student.teachers.all()
        return StudentFilterTeacherSerializer(teachers, many=True).data

和第二(可能不是您想要的,仍然是您所知):

注意:这将返回教师的所有字段。

class StudentFilterSerializer(serializers.ModelSerializer):

    class Meta:
        model = Student
        fields = ("first_name", "last_name", "unique_id",)
        # if you somehow have teachers field in 'student' model then you can also do
        depth = 1

很乐意提供帮助。 让我知道它是否有效,或者您什么都不懂。