代码之家  ›  专栏  ›  技术社区  ›  joe

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

  •  1
  • joe  · 技术社区  · 8 年前

    http://www.django-rest-framework.org/api-guide/validators/#currentuserdefault

    我想从中读取默认值 userprofile 自动地目前官方方法支持 User DateTime . 但我想要我的定制价值。我该怎么做?

    owner = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   joe    8 年前

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

    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())
    
        2
  •  0
  •   MegaJoe    7 年前

    如果要使用序列化程序中的其他传入字段计算一个隐藏字段, 然后需要使用serializer\u字段。上下文['request']。数据

    此“数据”将在“set\u 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())