修改序列化值 - Django Rest Framework

Cod*_*ise 7 python django django-models django-rest-framework

我有一个包含敏感数据的模型,比如社会保险号,我想将序列化数据转换为仅显示最后四位数字。

我存储了完整的社会安全号码: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)
Run Code Online (Sandbox Code Playgroud)

我的序列化器:

class EmployeeSerializer(serializers.ModelSerializer):

    id = serializers.ReadOnlyField()

    class Meta:
        model = Employee

        fields = ('id','ssn')

        read_only_fields = ['id']
Run Code Online (Sandbox Code Playgroud)

nev*_*ner 9

您可以使用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]
Run Code Online (Sandbox Code Playgroud)


dhk*_*hke 5

如果您不需要更新 ssn,只需用 a 遮蔽该字段SerializerMethodFieldget_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
Run Code Online (Sandbox Code Playgroud)

'ssn' in data根据需要添加特殊情况处理 ( )。