Django Rest Framework Список сериализаторов строк - PullRequest
0 голосов
/ 09 июля 2020

У меня есть две модели, созданные в моем приложении Django, и я ищу подход к сериализации, чтобы IP-адреса отображались в JSON как список строк, а не список объектов IPAddress.

Желаемое JSON

[
    {
        "hostname": "www.example.com",
        "ip_addresses": [ "1.1.1.1", "2.2.2.2" ]
    }
] 

Текущее JSON

[
    {
        "hostname": "www.example.com",
        "ip_addresses": [
            {
                "id": 1,
                "ip_address": "1.1.1.1"
            },
            {
                "id": 2,
                "ip_address": "2.2.2.2"
            }
        ]
] 

urls.py

class HostSerializer(serializers.ModelSerializer):
    hostname = serializers.CharField(source='name', read_only=True)

    class Meta:
        model = Host
        fields = ['hostname', 'ip_addresses']
        depth = 1

models.py

class IPAddress(models.Model):
    ip_address = models.GenericIPAddressField()

    def __str__(self):
        return str(self.ip_address)

class Host(models.Model):
    name = models.CharField(max_length=100)
    ip_addresses = models.ManyToManyField(IPAddress)

    def __str__(self):
        return self.name

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Попробуйте это!

class HostSerializer(serializers.Serializer):
    hostname = serializers.CharField(source='name', read_only=True)
    ip_addresses = serializers.SerializerMethodField(read_only=True)

    def get_ip_addresses(self, instance):
        return [item.ip_address for item in instance.ip_addresses.all()]
0 голосов
/ 09 июля 2020

Вы можете использовать serializers.SerializerMethodField() для достижения желаемого:

class HostSerializer(serializers.ModelSerializer):
    hostname = serializers.CharField(source='name', read_only=True)
    ip_addresses: serializers.SerializerMethodField()

    class Meta:
        model = Host
        fields = ['hostname', 'ip_addresses']
        depth = 1

    def get_ip_addresses(self, instance):
        return [item.ip_address for item in instance.ip_addresses]
...