首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改序列化的值- Django Rest框架

修改序列化的值- Django Rest框架
EN

Stack Overflow用户
提问于 2018-05-19 16:23:56
回答 3查看 6K关注 0票数 12

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

我有完整的社保号码:123-45-6789。我希望序列化程序输出包含:***-**-6789

我的模特:

代码语言:javascript
复制
class Employee (models.Model):

    name  = models.CharField(max_length=64,null=True,blank=True)
    ssn   = models.CharField(max_length=16,null=True,blank=True)

我的序列化器:

代码语言:javascript
复制
class EmployeeSerializer(serializers.ModelSerializer):

    id = serializers.ReadOnlyField()

    class Meta:
        model = Employee

        fields = ('id','ssn')

        read_only_fields = ['id']
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-19 16:36:22

您可以使用SerializerMethodField

代码语言:javascript
复制
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]
票数 11
EN

Stack Overflow用户

发布于 2018-05-19 16:37:29

如果不需要更新ssn,只需用SerializerMethodField隐藏字段并在序列化程序上定义get_ssn(self, obj)即可。

否则,最简单的方法可能就是重写.to_representation()

代码语言:javascript
复制
def to_representation(self, obj):
    data = super(EmployeeSerializer, self).to_representation(obj)
    data['ssn'] = self.mask_ssn(data['ssn'])
    return data

如有必要,请添加特殊案例处理('ssn' in data)。

票数 6
EN

Stack Overflow用户

发布于 2020-01-13 16:29:44

详细说明@dhke的答案时,如果您希望能够重用此逻辑来修改跨多个序列化程序的序列化,则可以编写自己的字段并将其用作序列化程序中的字段,例如:

代码语言:javascript
复制
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,则可以将转换应用到图像上)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50427289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档