Django REST сериализаторы вложенных объектов - PullRequest
0 голосов
/ 10 марта 2019

У меня есть текущий 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" },
  ]
}​
]

Serializers.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

1 Ответ

1 голос
/ 10 марта 2019

Если вы хотите настроить способ сериализации вашей модели, переопределите метод to_representation сериализатора.Это действительно идет вразрез с дизайном REST API, поэтому я не рекомендую его.Вы должны создать отдельный сериализатор для TypeSerializer для лучшего результата.

Добавьте этот метод в SchoolSerialzer для достижения желаемого формата:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...