You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DRF:如何实现字段写入加密、读取返回加密值的逻辑?

更优实现方案:单序列化器内统一处理加密逻辑

你提到的两种方案都可行,但更简洁且低耦合的方式是在序列化器层面封装加密逻辑,既不用拆分多个序列化器,也不会污染模型层的职责。核心思路是利用DRF序列化器的to_internal_value(处理输入转存)和to_representation(处理读取返回)方法,在同一个序列化器里完成写入加密、读取返回原值的需求。

推荐实现:自定义可复用加密字段类

把加密逻辑封装成通用字段,方便在多个序列化器中复用:

from rest_framework import serializers
from your_encryption_utils import encrypt  # 替换成你的加密函数

class EncryptedCharField(serializers.CharField):
    def to_internal_value(self, data):
        # 写入接口(create/patch/partial_patch)接收明文,加密后传给模型存储
        return encrypt(data)
    
    def to_representation(self, value):
        # 读取接口(list/retrieve)直接返回数据库中存储的加密值
        return value

然后在你的业务序列化器中直接使用这个字段:

from rest_framework import serializers
from .models import YourModel

class YourModelSerializer(serializers.ModelSerializer):
    sensitive_field = EncryptedCharField()  # 替换成你的字段名

    class Meta:
        model = YourModel
        fields = ['id', 'sensitive_field', ...]

极简实现:单一场景下直接重写序列化器逻辑

如果不需要复用加密逻辑,也可以直接在目标序列化器中针对字段处理:

from rest_framework import serializers
from your_encryption_utils import encrypt
from .models import YourModel

class YourModelSerializer(serializers.ModelSerializer):
    sensitive_field = serializers.CharField()

    def to_internal_value(self, data):
        # 先执行父类的字段验证逻辑
        validated_data = super().to_internal_value(data)
        # 对指定字段做加密处理
        if 'sensitive_field' in validated_data:
            validated_data['sensitive_field'] = encrypt(validated_data['sensitive_field'])
        return validated_data

    # 读取时父类默认返回字段原值,无需额外重写to_representation

    class Meta:
        model = YourModel
        fields = ['id', 'sensitive_field', ...]

你提到的两种方案的局限性

  • 多序列化器方案:需要在ViewSet中根据请求方法切换序列化器,代码冗余且维护成本高——后续修改加密逻辑或新增字段时,要同步修改多个序列化器,容易出现遗漏。
  • 模型内置加密方案:把业务加密逻辑耦合到模型层,违反了单一职责原则。模型只应负责数据结构定义,不该处理业务加密;如果后续其他场景使用该模型但不需要加密,会出现逻辑冲突。

补充注意事项

  • 确保加密算法安全(如AES对称加密),密钥要妥善保管,禁止硬编码在代码中。
  • 如果需要在后台管理等场景查看明文,可以单独编写一个管理用的序列化器,在其中添加解密逻辑。

内容的提问来源于stack exchange,提问作者Empusas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 09:07:30