Получить сериализованные данные в другом формате

Как я могу получить json в новом формате, как просто text/value как:

[
    {
        "name": "doc2",
        "directions": [
       
            "mar", 
            "qwe"
           
        ]
    },
    {
        "name": "John",
        "directions": [
              "Surgery",
              "qwe"
        ]
    }
]

И не как:

[
    {
        "name": "doc2",
        "directions": [
            {
                "name": "mar"
            },
            {
                "name": "qwe"
            }
        ]
    },
    {
        "name": "John",
        "directions": [
            {
                "name": "Surgery"
            },
            {
                "name": "qwe"
            }
        ]
    }
]

Вот мои models.py и serializers.py модули: models.py

class Directions(models.Model):
    name = models.CharField(max_length=355)

    def __str__(self):
        return self.name


class Doctors(models.Model):
    name = models.CharField(max_length=255)
    directions = models.ManyToManyField(Directions)

    def __str__(self):
        return self.name

serializer.py

class DirectionsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Directions
        fields = ('name',)


class DoctorsSerializer(serializers.ModelSerializer):
    directions = DirectionsSerializer(many=True)
    class Meta:
        model = Doctors
        fields = ('name', 'directions')

У вас есть два варианта достижения этой цели:

  1. Использование Custom relational fields:

В вашем случае мы можем определить реляционное поле для сериализации трека в пользовательское строковое представление, используя его порядок, название и продолжительность:


class DirectionsSerializer(serializers.RelatedField):
    def to_representation(self, value):
        return value.name

class DoctorsSerializer(serializers.ModelSerializer):
    directions = DirectionsSerializer(many=True)

    class Meta:
        model = Doctors
        fields = ['name', 'directions']

Затем это пользовательское поле будет сериализовано в следующем представлении:

[
    {
        "name": "doc2",
        "directions": [
       
            "mar", 
            "qwe"
           
        ]
    },
    {
        "name": "John",
        "directions": [
              "Surgery",
              "qwe"
        ]
    }
]
  1. Использование StringRelatedField():

StringRelatedField может использоваться для представления цели отношения с помощью своего метода __str__.

Например, следующий сериализатор:

class DoctorsSerializer(serializers.ModelSerializer):
    directions = serializers.StringRelatedField(many=True)

    class Meta:
        model = Doctors
        fields = ['name', 'directions']

Сериализуется в следующее представление:

[
    {
        "name": "doc2",
        "directions": [
       
            "mar", 
            "qwe"
           
        ]
    },
    {
        "name": "John",
        "directions": [
              "Surgery",
              "qwe"
        ]
    }
]

Это поле read_only.

Аргументы:

  • many - Если применяется к отношению "ко многим", следует установить этот аргумент в True.
Вернуться на верх