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
相关产品推荐
相关产品推荐

