如何为两个序列化程序动态使用嵌套序列化程序?
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}}
现在我有两个嵌套的序列化程序,其中包含上述 LIST
和 DETAIL
端点的序列化程序:-
第二个序列化程序
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',]
现在,我对 List
和 Detail
端点使用相同的 DeviceConfigSerializer
序列化程序,但对于列表端点,我已将嵌套序列化程序设置为 write_only=True
, 但是我想用 DeviceListSerializer
serilaizer 列表端点做的是,在 DeviceConfigSerializer
的所有字段中,我想要 status
和 backend
字段为 read
和 write
,其他字段为 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
。
简而言之:-
我正在尝试对 DeviceListSerilaizer
和 DeviceDetailSerializer
使用相同的 DeviceConfigSerializer
。但是对于 DeviceListSerializer
,我希望 DeviceConfigSerializer
中的 status
和 backend
字段既可读又可写,目前设置为仅针对 [=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
这是不可能的,所以我不得不引入两个新的序列化器来满足我的需要。
我正在使用 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}}
现在我有两个嵌套的序列化程序,其中包含上述 LIST
和 DETAIL
端点的序列化程序:-
第二个序列化程序
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',]
现在,我对 List
和 Detail
端点使用相同的 DeviceConfigSerializer
序列化程序,但对于列表端点,我已将嵌套序列化程序设置为 write_only=True
, 但是我想用 DeviceListSerializer
serilaizer 列表端点做的是,在 DeviceConfigSerializer
的所有字段中,我想要 status
和 backend
字段为 read
和 write
,其他字段为 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
。
简而言之:-
我正在尝试对 DeviceListSerilaizer
和 DeviceDetailSerializer
使用相同的 DeviceConfigSerializer
。但是对于 DeviceListSerializer
,我希望 DeviceConfigSerializer
中的 status
和 backend
字段既可读又可写,目前设置为仅针对 [=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
这是不可能的,所以我不得不引入两个新的序列化器来满足我的需要。