Django rest - преобразовать поле в список? - PullRequest
1 голос
/ 23 апреля 2019

В моей модели есть текстовое поле, в котором хранятся словари. Я хотел бы преобразовать это поле в словарь, если это возможно, в сериализаторе покоя.

в тот момент, когда поле возвращает словарь, но обратная косая черта всех кавычек, возможно преобразовать строки во вложенный список слов?

Спасибо

API в настоящее время возвращается ниже:

{
        "id": 3,
        "hostname": "WAN-EDGE",
        "timestamp": "2019-04-12T11:34:36.654521",
        "routing_table": "[{\"route\": \"0.0.0.0\", \"subnet_mask\": \"0.0.0.0\", \"next_hop\": \"172.16.66.193\"}, {\"route\": \"10.10.21.0\", \"subnet_mask\": \"255.255.255.0\", \"next_hop\": \"172.16.67.146\"}, {\"route\": \"10.22.0.0\", \"subnet_mask\": \"255.255.0.0\", \"next_hop\": \"172.18.1.5\"}, {\"route\": \"10.31.0.0\", \"subnet_mask\": \"255.255.0.0\", \"next_hop\": \"172.16.67.146\"},...]"
    },...
}   

желаемый результат вложенного списка диктов

{
        "id": 3,
        "hostname": "WAN-EDGE",
        "timestamp": "2019-04-12T11:34:36.654521",
        "routing_table": [
                        {
                            "route": "0.0.0.0",
                            "subnet_mask": "0.0.0.0",
                            "next_hop": "172.16.66.193"
                        },
                        {
                            "route": "10.10.21.0",
                            "subnet_mask": "255.255.255.0",
                            "next_hop": "172.16.67.146"
                        },
                        {
                            "route": "10.22.0.0",
                            "subnet_mask": "255.255.0.0",
                            "next_hop": "172.18.1.5"
                        },
                        {
                            "route": "10.31.0.0",
                            "subnet_mask": "255.255.0.0",
                            "next_hop": "172.16.67.146"
                        },...
                    ]
    },...
}

Текущий сериализатор:

class RoutingTableSerializer(serializers.ModelSerializer):
    hostname = serializers.ReadOnlyField(
        source='device.hostname',
    )
    rt = serializers.JSONField(
        source='routing_table'
    )
    class Meta:
        model = DeviceData
        fields = ('id','hostname','timestamp','rt')   

1 Ответ

2 голосов
/ 23 апреля 2019

Вам может понадобиться serializers.JSONField()


Update-1
Вы также можете попробовать с SerializerMethodField() как

<b>import json</b>


class RoutingTableSerializer(serializers.ModelSerializer):
    hostname = serializers.ReadOnlyField(source='device.hostname', )
    <b>rt = serializers.SerializerMethodField(source='routing_table', read_only=True)

    def get_routing_table(self, instance):
        return json.loads(instance.routing_table)</b>

    class Meta:
        model = DeviceData
        fields = ('id', 'hostname', 'timestamp', 'rt')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...