如何在django restframework的使用嵌套序列化器的串行器中动态改变字段映射?

时间:2017-07-11 08:17:26

标签: django django-rest-framework

我在大多数requests中使用以下序列化程序,例如GETPOST等:

class PrescriptionSerializer(serializer.ModelSerializer):
    tags = TagSerializer()
    setting = SettingSerializer()

但是,我想将setting字段映射到SettingUpdateSerializer() if request.actionUPDATE(= PUT/PATCH)。如果没有潜水PrescriptionGetSerializerPrescriptionUpdateSerialzer并相应地使用它们,有没有办法将序列化程序嵌套字段动态映射到其他序列化程序,如下所示?

class PrescriptionSerializer(serializer.ModelSerializer):
    tags = TagSerializer()
    setting = SettingUpdateSerializer()

我虽然在self.fields.pop上使用__init__,但这样只能使用不同的字段名称,例如update_settingget_setting

感谢您的帮助。

1 个答案:

答案 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方法,那么它已经被传递。