我在大多数requests
中使用以下序列化程序,例如GET
,POST
等:
class PrescriptionSerializer(serializer.ModelSerializer):
tags = TagSerializer()
setting = SettingSerializer()
但是,我想将setting
字段映射到SettingUpdateSerializer()
if request.action
是UPDATE
(= PUT/PATCH
)。如果没有潜水PrescriptionGetSerializer
和PrescriptionUpdateSerialzer
并相应地使用它们,有没有办法将序列化程序嵌套字段动态映射到其他序列化程序,如下所示?
class PrescriptionSerializer(serializer.ModelSerializer):
tags = TagSerializer()
setting = SettingUpdateSerializer()
我虽然在self.fields.pop
上使用__init__
,但这样只能使用不同的字段名称,例如update_setting
和get_setting
。
感谢您的帮助。
答案 0 :(得分:1)
我认为最明确的解决方案是创建两个独立的序列化程序。并选择在视图层中使用的序列化程序取决于http动词。如果使用viewset,则可以使用get_serializer_class
方法轻松实现。
class SomeViewSet(viewsets.ModelViewset):
def get_serializer_class(self):
if self.action === 'update':
return UpdatePrescriptionSerializer
return PrescriptionSerializer
现在,当您在操作方法中调用get_serializer
时,您将获得序列化程序取决于操作。
但你也可以像你说的那样做:
class PrescriptionSerializer(serializer.ModelSerializer):
def __init__(self, *args, **kwargs):
super(PrescriptionSerializer, self).__init__(*args, **kwargs)
if self.context['request'].method == 'PUT':
self.fields['setting'] = SettingUpdateSerializer()
else:
self.fields['setting'] = SettingSerializer()
tags = TagSerializer()
确保将请求传递给序列化程序上下文。如果您在视图集中使用get_serializer
方法,那么它已经被传递。