You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Rest Framework序列化时修改字段值的实现方法

没问题,我来帮你搞定这个SSN脱敏的需求!在Django REST Framework里,我们有两种简单又实用的方案来实现序列化时只显示SSN最后四位,隐藏前面的敏感部分:

方案一:用SerializerMethodField快速实现

这个方案最直观,直接在序列化器里自定义一个处理SSN的方法:

class EmployeeSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()
    # 用SerializerMethodField来生成脱敏后的SSN
    ssn = serializers.SerializerMethodField()

    class Meta:
        model = Employee
        fields = ('id', 'ssn')
        read_only_fields = ['id']

    def get_ssn(self, obj):
        # 先判断SSN是否存在且格式符合要求
        if obj.ssn and len(obj.ssn) >= 4:
            # 保留最后四位,前面替换成***-**-
            return f"***-**-{obj.ssn[-4:]}"
        # 如果SSN为空或者长度不够,直接返回原数据避免报错
        return obj.ssn

原理很简单:SerializerMethodField会自动调用对应的get_<字段名>方法,我们在这个方法里完成脱敏逻辑,把除了最后四位之外的部分替换成星号。

方案二:自定义字段类(适合复用场景)

如果你需要在多个序列化器里处理SSN脱敏,自定义字段类会更高效,代码复用性更强:

# 先定义一个通用的脱敏SSN字段
class MaskedSSNField(serializers.CharField):
    def to_representation(self, value):
        # 重写序列化时的转换逻辑
        if value and len(value) >= 4:
            return f"***-**-{value[-4:]}"
        return value

# 然后在序列化器里使用这个字段
class EmployeeSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()
    # 用自定义的脱敏字段替代默认的CharField
    ssn = MaskedSSNField(read_only=True)

    class Meta:
        model = Employee
        fields = ('id', 'ssn')
        read_only_fields = ['id']

这里我们重写了字段的to_representation方法,这个方法专门负责把模型中的原始值转换成序列化后的输出格式,后续任何需要脱敏SSN的地方,直接用MaskedSSNField就行。

额外提示:支持SSN写入的场景

如果你的序列化器需要同时支持接收完整SSN(创建/更新员工)和返回脱敏后的SSN,可以调整成这样:

class EmployeeSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()
    # 新增一个只读的脱敏字段,专门用于返回给前端
    masked_ssn = serializers.SerializerMethodField()

    class Meta:
        model = Employee
        fields = ('id', 'ssn', 'masked_ssn')
        read_only_fields = ['id', 'masked_ssn']

    def get_masked_ssn(self, obj):
        if obj.ssn and len(obj.ssn) >= 4:
            return f"***-**-{obj.ssn[-4:]}"
        return obj.ssn

这样前端可以通过ssn字段提交完整的社会保障号码,读取数据时则通过masked_ssn获取脱敏后的结果,既满足业务需求又能避免敏感数据泄露。

内容的提问来源于stack exchange,提问作者user6750100

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:03:58