Вывод сериализатора Django как часть объекта JSON - PullRequest
1 голос
/ 02 мая 2019

Контекст

У меня есть 2 модели: Customer & DeviceGroup.

В настоящее время у меня есть конечная точка API /api/v1/device-groups/?customer_uuid=<customer_uuid>, которая возвращает DeviceGroups, которые связаны с данным Customer следующим образом:

[
    {
        "group_uuid": "c61361ac-0826-41bb-825a-8aa8e014ae0c",
        "device_group_name": "Default",
        "color": "0a2f45",
        "is_default": true
    },
    {
        "group_uuid": "1a86e8e4-b41b-4f33-aefb-ce984ef96144",
        "device_group_name": "Testgroup",
        "color": "123456",
        "is_default": false
    }
] 

Цель

Я хочу, чтобы массив DeviceGroups был частью такого объекта:

"device_groups": 
[
    {
        "group_uuid": "c61361ac-0826-41bb-825a-8aa8e014ae0c",
        "device_group_name": "Default",
        "color": "0a2f45",
        "is_default": true
    },
    {
        "group_uuid": "1a86e8e4-b41b-4f33-aefb-ce984ef96144",
        "device_group_name": "Testgroup",
        "color": "123456",
        "is_default": false
    }
] 

Модель

# models.py

class Customer(models.Model):
    customer_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)
    customer_name = models.CharField(max_length=128, unique=True)


class DeviceGroup(models.Model):
    group_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)
    customer_uuid = models.ForeignKey(Customer, on_delete=models.DO_NOTHING)
    device_group_name = models.CharField(max_length=20)
    color = models.CharField(max_length=10)
    is_default = models.BooleanField(default=False)

Serializer

# serializers.py

class DeviceGroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = DeviceGroup
        fields = ('group_uuid', 'device_group_name', 'color', 'is_default')

View

# views.py

class DeviceGroupCustomerViewSet(viewsets.ModelViewSet):
    serializer_class = DeviceGroupSerializer

    def get_queryset(self):
        return DeviceGroup.objects.filter(customer_uuid=self.request.GET['customer_uuid'])

Я пытался создать новый serializer, но это не решило мою проблему:

class TestSerializer(serializers.ModelSerializer):
    device_groups = DeviceGroupSerializer(many=True, read_only=True)

    class Meta:
        model = DeviceGroup
        fields = ('device_groups', 'group_uuid', 'device_group_name', 'color', 'is_default')

Что мне нужно изменить, чтобы получить желаемый результат?

Ответы [ 3 ]

4 голосов
/ 02 мая 2019

Просто измените ваш новый сериализатор с именем TestSerializer следующим образом.

class TestSerializer(serializers.Serializer):
    device_groups = serializers.SerializerMethodField(read_only=True)

    def get_device_groups(self, model):
        return DeviceGroupSerializer(model).data

Ответ будет разбит на страницы.Если вы хотите отключить его, просто укажите pagination_class как None в вашем классе ModelViewset.

4 голосов
/ 02 мая 2019

вы можете обновить ваши просмотры как

def list(self, request):
    queryset = DeviceGroup.objects.filter(customer_uuid=self.request.GET['customer_uuid'])
    serializer = UserSerializer(queryset, many=True)
    return Response({'device_groups': serializer.data})

, чтобы получить желаемый результат ..

1 голос
/ 02 мая 2019

Чтобы добиться этого довольно легко, не теряя нумерацию страниц, я бы сделал это:

from rest_framework.pagination import PageNumberPagination 

class DeviceGroupPagination(PageNumberPagination):

    def get_paginated_response(self, data):
        return Response(OrderedDict([
            ('count', self.page.paginator.count),
            ('next', self.get_next_link()),
            ('previous', self.get_previous_link()),
            ('device_groups', data)
        ]))

Тогда во взглядах

class DeviceGroupCustomerViewSet(viewsets.ModelViewSet):
    serializer_class = DeviceGroupSerializer
    pagination_class = DeviceGroupPagination
    ...

Так что теперь вместо results у вас будет device_groups

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...