Сгладить возвращение JSON от DRF - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть json API, возвращенный в следующем формате.
Но я хочу вернуть json API, разлагающий ключ зоны имен, как указано ниже.
Может кто-нибудь сказать мне, как я могу пересмотреть сериализатор для достижения этого?
сериализатор.py также указана ниже.
Для models.py и views.py см. мой предыдущий пост .

текущий

{
    "zone": {
        "zone": "office_enclosed",
        "namingzone": [
            {
                "naming": "moffice"
            }
        ]
    },
    "lpd": 11.9,
    "sensor": true
},
{
    "zone": {
        "zone": "office_open",
        "namingzone": [
            {
                "naming": "off"
            },
            {
                "naming": "office"
            }
        ]
    },
    "lpd": 10.5,
    "sensor": true
}  

Цель

{
    "zone": "office_enclosed",
    "naming": "moffice",
    "lpd": 11.9,
    "sensor": true
},
{
    "zone": "office_open",
    "naming": "off",
    "lpd": 10.5,
    "sensor": true
},
{
    "zone": "office_open",
    "naming": "office",
    "lpd": 10.5,
    "sensor": true
}  

serializer.py

class namingNewSerializer(serializers.ModelSerializer):

    class Meta:
        model=Naming
        fields=('naming',)

class zoneSerializer(serializers.ModelSerializer):
    namingzone=namingNewSerializer(many=True)

    class Meta:
        model=Zone
        fields = ('zone','namingzone')

class lightSerializer(serializers.ModelSerializer):
    zone = zoneSerializer()

    class Meta:
        model=Light
        fields = ('zone','lpd','sensor')

class namingSerializer(serializers.ModelSerializer):
    zone=zoneSerializer()

    class Meta:
        model=Naming
        fields=('zone','naming')

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Я бы сказал, что использование Serializer может усложнить реализацию.Скорее, вы можете принять питонический подход.Попробуйте вот так:

class SomeView(APIView):
     ...
     def get(self, request, *args, **kwargs):
         data = lightSerializer(Light.objects.all(), many=True).data
         data = list(data)  # convert lazy object to list
         updated_data = list()
         for item in data:
             newdict = dict()
             zone = item['zone']
             newdict.update({'zone':zone['zone'], 'lpd': item['lpd'], 'sensor':item['sensor']})
             for naming_zone in zone.get('namingzone'):
                 naming_zone.update(newDict)
                 updated_data.append(naming_zone)

         return Response(updated_data, status=status.HTTP_200_OK)
0 голосов
/ 30 ноября 2018

См. Документ поля DRF о source.Это поможет вам.

https://www.django -rest-framework.org / api-guide / fields / # source

...