Django序列化程序输出作为JSON对象的一部分

2024-04-20 01:06:35 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文

我有两个模型:Customer&;DeviceGroup。你知道吗

目前我有一个API端点/api/v1/device-groups/?customer_uuid=<customer_uuid>,它返回与给定Customer相关的DeviceGroups,如下所示:

[
    {
        "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)

序列化程序

# serializers.py

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

查看

# 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')

为了得到我想要的输出,我需要改变什么?你知道吗


Tags: namepytruedefaultuuidismodelsdevice
3条回答

只需按以下方式修改名为TestSerializer的新序列化程序。你知道吗

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

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

响应将是分页响应。如果您想禁用它,只需在ModelViewset类中将pagination类指定为None。你知道吗

你可以像这样更新你的视图

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})

这将得到所需的输出。。你知道吗

为了在不丢失分页的情况下轻松实现这一点,我将执行以下操作:

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

相关问题 更多 >