如何自定义django REST序列化程序的默认值

如何自定义django REST序列化程序的默认值,django,django-rest-framework,serialization,Django,Django Rest Framework,Serialization,我想从userprofile自动读取默认值。现在,官方方法支持User和DateTime。但我想要我的定制价值。我该怎么做 owner = serializers.HiddenField( default=serializers.CurrentUserDefault() ) 这是我的解决办法。复制源代码中的示例并将其放在此处。 希望在不久的将来它有友好的解决方案 class CurrentBranchDefault: def set_context(self, serializ

我想从
userprofile
自动读取默认值。现在,官方方法支持
User
DateTime
。但我想要我的定制价值。我该怎么做

owner = serializers.HiddenField(
    default=serializers.CurrentUserDefault()
)

这是我的解决办法。复制源代码中的示例并将其放在此处。 希望在不久的将来它有友好的解决方案

class CurrentBranchDefault:
    def set_context(self, serializer_field):
        self.user = serializer_field.context['request'].user
        self.branch = self.user.userprofile.selected_branch

    def __call__(self):
        return self.branch

    def __repr__(self):
        return unicode_to_repr('%s()' % self.__class__.__name__)


class StaffOrderSerializer(serializers.ModelSerializer):
    branch = serializers.HiddenField(default=CurrentBranchDefault())

如果要使用序列化程序中的其他传入字段计算一个隐藏字段, 然后,您需要使用serializer_field.context['request'].data

此“数据”将在“set_context()”之前进行验证,因此您可以在安全环境中使用它

我希望它能帮助别人

class DefineNoteType:
    def set_context(self, serializer_field):
        # setting field "type", calculated by other serializer fields
        data = serializer_field.context['request'].data
        subscriber = data.get('subscriber', None)
        connection = data.get('connection', None)
        if subscriber:
            self.type = 'subscriber_type'
        elif connection:
            self.type = 'connection_type'
        else:
            raise serializers.ValidationError('Custom error.')

    def __call__(self):
        return self.type


class NoteSerializer(serializers.ModelSerializer):
    type = serializers.HiddenField(default=DefineNoteType())