如何为两个序列化程序动态使用嵌套序列化程序?

How to use a nested serializer dynamically for two serializers?

我正在使用 Django、Django Rest Framework 开发 API,并试图实现这些(广告描述)

第一个序列化程序

class DeviceConfigSerializer(serializers.ModelSerializer):
    config = serializers.JSONField(initial={})
    context = serializers.JSONField(initial={})
    templates = FilterTemplatesByOrganization(many=True)

    class Meta:
        model = Config
        fields = ['backend', 'status', 'templates', 'context', 'config']
        extra_kwargs = {'status': {'read_only': True}}

现在我有两个嵌套的序列化程序,其中包含上述 LISTDETAIL 端点的序列化程序:-

第二个序列化程序

class DeviceListSerializer(FilterSerializerByOrgManaged, serializers.ModelSerializer):
    config = DeviceConfigSerializer(write_only=True, required=False)

    class Meta(BaseMeta):
        model = Device
        fields = ['id','name','organization','mac_address','key','last_ip','management_ip', 
                  'model', 'os', 'system', 'notes', 'config', 'created', 'modified',]

第三序列化程序

class DeviceDetailSerializer(BaseSerializer):
    config = DeviceConfigSerializer(allow_null=True)

    class Meta(BaseMeta):
        model = Device
        fields = ['id','name','organization','mac_address','key','last_ip','management_ip',
                  'model','os','system','notes','config','created','modified',]

现在,我对 ListDetail 端点使用相同的 DeviceConfigSerializer 序列化程序,但对于列表端点,我已将嵌套序列化程序设置为 write_only=True , 但是我想用 DeviceListSerializer serilaizer 列表端点做的是,在 DeviceConfigSerializer 的所有字段中,我想要 statusbackend字段为 readwrite,其他字段为 write_only.

目前使用此配置,我从 DeviceListSerializer 收到这样的响应:-

{
            "id": "12",
            "name": "tests",
            "organization": "-------",
            "mac_address": "-------",
            "key": "------",
            "last_ip": null,
            "management_ip": null,
            "model": "",
            "os": "",
            "system": "",
            "notes": "",
            "created": "2021-04-26T10:41:25.399160+02:00",
            "modified": "2021-04-26T10:41:25.399160+02:00"
}

我想要实现的是:-

{
            "id": "12",
            "name": "tests",
            "organization": "----",
            "mac_address": "-----",
            "key": "----",
            "last_ip": null,
            "management_ip": null,
            "model": "",
            "os": "",
            "system": "",
            "notes": "",
            "config": {
                 "status": "...",
                 "backend": "...",
            ,}
            "created": "2021-04-26T10:41:25.399160+02:00",
            "modified": "2021-04-26T10:41:25.399160+02:00"
}

PS:我尝试为这两个字段引入一个额外的序列化器并将其嵌套到DeviceListSerializer,但我不想为这两个字段引入额外的序列化器,并且期待是否可以使用相同的嵌套序列化程序实现这一点。

简而言之:-

我正在尝试对 DeviceListSerilaizerDeviceDetailSerializer 使用相同的 DeviceConfigSerializer。但是对于 DeviceListSerializer,我希望 DeviceConfigSerializer 中的 statusbackend 字段既可读又可写,目前设置为仅针对 [=21] 写入=].

PrimaryKeyRelatedField 可用于使用其主键表示关系的目标 例如,以下序列化程序:

class AlbumSerializer(serializers.ModelSerializer):
    tracks = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ['album_name', 'artist', 'tracks']

将序列化为这样的表示:

{
    'album_name': 'Undun',
    'artist': 'The Roots',
    'tracks': [
        89,
        90,
        91,
        ...
    ]
}

您可以在序列化中使用这种方法。参考文献https://www.django-rest-framework.org/api-guide/relations/#primarykeyrelatedfield

这是不可能的,所以我不得不引入两个新的序列化器来满足我的需要。