【问题标题】:How to use a nested serializer dynamically for two serializers?如何为两个序列化器动态使用嵌套序列化器?
【发布时间】:2021-07-24 00:31:48
【问题描述】:

我正在使用 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,但我不想为这两个字段引入一个额外的序列化程序,并期待这是否可以实现同一个嵌套序列化器。

  • 每个设备实例都包含config

简而言之:-

我正在尝试对DeviceListSerilaizerDeviceDetailSerializer 使用相同的DeviceConfigSerializer。但是对于DeviceListSerializer,我希望DeviceConfigSerializer 中的statusbackend 字段既可以读取又可以写入,目前设置为只为DeviceListSerializer 写入。

【问题讨论】:

    标签: django api django-rest-framework django-serializer


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-28
        • 2017-07-12
        相关资源
        最近更新 更多