Как спроектировать сериализатор в рамке отдыха django для ответа Json? - PullRequest
0 голосов
/ 04 мая 2019

Привет, я новичок в django rest framework. В настоящее время я работаю над тем, что содержит ответ 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 Ответ

3 голосов
/ 04 мая 2019

Было бы проще дать правильный ответ, если бы мы увидели, как реализованы ваши модели.Не зная связи полей, я все равно попробую

Вот два вида решений:

Первый:

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

РадПомогите.Дайте мне знать, если это работает, или вы ничего не понимаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...