Django嵌套与serializermethodfield的序列化器

时间:2019-05-06 11:35:30

标签: python django django-rest-framework

上下文

我有一个API端点api/v1/checkin/,该端点返回当前DeviceGroupAppVersions的{​​{1}},它们必须处于活动状态。

问题

端点当前返回数据以及经过正确过滤的App,如下所示:

AppVersions

目标

我希望响应中的{ "customer_device_uuid": "8d252b78-6785-42ea-9aee-b6f9e0f870b5", "device_group": { "group_uuid": "869b409d-f281-492e-bb62-d3168aea4394", "device_group_name": "Default", "color": "#0a2f45", "is_default": true, "app_versions": [ "2.0", "1.1" ] } } 包含更多这样的数据:

app_versions

序列化器

{
    "customer_device_uuid": "8d252b78-6785-42ea-9aee-b6f9e0f870b5",
    "device_group": {
        "group_uuid": "869b409d-f281-492e-bb62-d3168aea4394",
        "device_group_name": "Default",
        "color": "#0a2f45",
        "is_default": true,
        "app_versions": [
            {
                "app_version_uuid": "UUID here",
                "app_version_name": "1.1",
                "package_id": "package name here",
                "auto_start": false,
                "version_code": 1,
                "version_name": "0.1",
                "source": "link to file here"
            }, ...
        ]
    }
}

我猜测我必须更改# serializers.py class AppVersionSerializer(serializers.ModelSerializer): auto_start = serializers.BooleanField(source='app_uuid.auto_start') class Meta: model = AppVersion fields = ('app_version_uuid', 'app_version_name', 'package_id', 'auto_start', 'version_code', 'version_name', 'source') class DeviceGroupSerializer(serializers.ModelSerializer): app_versions = serializers.SerializerMethodField(read_only=True) # filters the app versions per app def get_app_versions(self, model): qs = model.get_current_app_versions() return [o.app_version_name for o in qs] class Meta: model = DeviceGroup fields = ('group_uuid', 'device_group_name', 'color', 'is_default', 'app_versions') class CheckinSerializer(serializers.ModelSerializer): device_group = DeviceGroupSerializer(many=False, read_only=True, source='group_uuid') class Meta: model = CustomerDevice fields = ('customer_device_uuid', 'customer_uuid', 'device_id_android', 'device_group') extra_kwargs = { 'customer_uuid': {'write_only': True}, 'device_id_android': {'write_only': True} } 才能实现自己的目标,但我不知道如何实现。

为了获得所需的响应,我应该改变什么?

编辑

执行过滤的get_app_versions()方法

get_current_app_versions

1 个答案:

答案 0 :(得分:2)

您正确的假设是必须更改get_app_versions,而不是返回行return [o.app_version_name for o in qs]的列表,而是需要返回字典的列表。

您将需要为AppVersions模型创建一个完整的序列化器。然后在get_app_versions中正确地序列化您的返回值,方法是将它们传递到新的序列化器中,该序列化器包含您要返回的所有字段return AppVersionSerializer2(qs, many=True).data

您可能必须覆盖某些字段的序列化,因为序列化程序可能无法很好地处理它们。