代码之家  ›  专栏  ›  技术社区  ›  Maverik Minett

修改序列化的值-django rest framework

  •  1
  • Maverik Minett  · 技术社区  · 6 年前

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

    我存储了完整的社会保险号码: 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']
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   neverwalkaloner    6 年前

    你可以用 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]
    
        2
  •  2
  •   dhke    6 年前

    如果不需要更新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 )必要时。