我有一个包含敏感数据的模型,比如说一个社会保险号码,我想在序列化时将这些数据转换成只显示最后四位数。
我有完整的社保号码:123-45-6789。我希望序列化程序输出包含:***-**-6789
我的模特:
class Employee (models.Model):
name = models.CharField(max_length=64,null=True,blank=True)
ssn = models.CharField(max_length=16,null=True,blank=True)我的序列化器:
class EmployeeSerializer(serializers.ModelSerializer):
id = serializers.ReadOnlyField()
class Meta:
model = Employee
fields = ('id','ssn')
read_only_fields = ['id']发布于 2018-05-19 16:36:22
您可以使用SerializerMethodField
class EmployeeSerializer(serializers.ModelSerializer):
id = serializers.ReadOnlyField()
ssn = SerializerMethodField()
class Meta:
model = Employee
fields = ('id','ssn')
read_only_fields = ['id']
def get_ssn(self, obj):
return '***-**-{}'.format(obj.ssn.split('-')[-1]发布于 2018-05-19 16:37:29
如果不需要更新ssn,只需用SerializerMethodField隐藏字段并在序列化程序上定义get_ssn(self, obj)即可。
否则,最简单的方法可能就是重写.to_representation()
def to_representation(self, obj):
data = super(EmployeeSerializer, self).to_representation(obj)
data['ssn'] = self.mask_ssn(data['ssn'])
return data如有必要,请添加特殊案例处理('ssn' in data)。
发布于 2020-01-13 16:29:44
详细说明@dhke的答案时,如果您希望能够重用此逻辑来修改跨多个序列化程序的序列化,则可以编写自己的字段并将其用作序列化程序中的字段,例如:
from rest_framework import serializers
from rest_framework.fields import CharField
from utils import mask_ssn
class SsnField(CharField):
def to_representation(self, obj):
val = super().to_representation(obj)
return mask_ssn(val) if val else val
class EmployeeSerializer(serializers.ModelSerializer):
ssn = SsnField()
class Meta:
model = Employee
fields = ('id', 'ssn')
read_only_fields = ['id']您还可以扩展其他字段,如rest_framework.fields.ImageField,以自定义图像URL的序列化方式(如果在图像之上使用图像CDN,则可以将转换应用到图像上)。
https://stackoverflow.com/questions/50427289
复制相似问题