DRF - вложенные сериализаторы с обратной связью - PullRequest
0 голосов
/ 09 ноября 2019

Как я могу создать сериализатор, который возвращает все результаты для family, со ВСЕМИ обратными отношениями?

         Family
           |
    +------+------+
    |             |
 Student    EmergencyContact
    |
   Fee

например,

{family: [{id: 1,
          student_set: [{id: 1, name: "bob Jones", fee_set: [{"Maths Fee": 3,  "English Fee": 5}}],
                        {id: 2, name: "Mike Jones", fee_set: [{"English Fee": 5}}],
          emergency_contact_set: [{id: 1, name:"Joe"}, {id: 2, name: "Mike"}]
         ]
}

Я могу получить одиночный вложенный уровень данных с использованием <model>_set в полях, например, student_set, emergency_contact_set, но не глубокая вложенность, (fee_set).

class FamilySerializer(serializers.ModelSerializer):
    student = StudentSerializer(many=True, read_only=True)  # does nothing
    class Meta:
          model = Family
          fields = ["id",
                    "name", 
                    "student", # returns nothing
                    "student_set" # only returns the students WITHOUT the fees
                   ]

Выход (не имеет fees):

{family: [{id: 1,
          student_set: [{id: 1, name: "bob Jones"}],
                        {id: 2, name: "Mike Jones"}],
          emergency_contact_set: [{id: 1, name:"Joe"}, {id: 2, name: "Mike"}],
         ]
}

В идеале я хотел бы использовать StudentSerializer и EmergencyContactSerializer внутри Family, чтобы получить вложенные множества.

1 Ответ

0 голосов
/ 10 ноября 2019

Вы должны использовать source kwarg в XXXXSerializer, например. source="<field>_set" (или переименуйте related_field в модели и используйте его как source).

class FamilySerializer(serializers.ModelSerializer):
    student = StudentSerializer(many=True, read_only=True, source="student_set") 
    ...

    class Meta:
        ...

и поле student будет доступно для использования StudentSerializer

См .: https://riptutorial.com/django-rest-framework/example/30725/getting-list-of-all-related-children-objects-in-parent-s-serializer

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