【问题标题】:Merge two fields in one in a Django Rest Framework Serializer在 Django Rest Framework Serializer 中将两个字段合并为一个
【发布时间】:2016-09-08 09:51:55
【问题描述】:

我正在使用带有默认用户表的 Django Rest Framework 身份验证系统。在该表中,它将名字和姓氏分成两个不同的字符字段。

是否可以在序列化程序中加入这两个字段?像这样的:

class UserSerializer(serializers.ModelSerializer):
    full_name = serializers.CharField(source='user.first_name' + ' ' + 'user.last_name')

这样我会得到以下响应:

{
    full_name: "firs_name last_name"
}

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您可以在序列化程序中创建方法并通过SerializerMethodField 显示它

    class UserSerializer(serializers.ModelSerializer):
        full_name = serializers.SerializerMethodField()
    
        def get_full_name(self, obj):
            return '{} {}'.format(obj.first_name, obj.last_name) 
    

    【讨论】:

    • 是否可以使用这种方法将两个或多个有效负载添加到一个中?
    【解决方案2】:

    @Ivan semochkin 的答案在 full_name 是只读字段时有效,但在我的情况下,我允许用户设置全名,因此必须创建一个自定义字段,它适用于两种情况。

    class FullNameField(serializers.Field):
        def to_representation(self, value):
            return value.get_full_name()
    
        def to_internal_value(self, full_name):
            fname, lname = full_name.split(' ')
            return {'first_name': fname, 'last_name': lname}
    

    现在将此字段包含在您的序列化程序中。

    class UserSerializer(serializers.ModelSerializer):
        full_name = FullNameField(source='*')
    

    【讨论】:

    • 此响应可以改进,因为 1) ret 未定义 2) value.get_full_name() - 可能会提到哪种方法(我猜是模型方法)我还是给了+1,因为它很有帮助并为我工作(读取+设定值);)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2016-04-12
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 2014-03-28
    相关资源
    最近更新 更多