【Django model层修改返回数据】
Django model层修改返回数据
使用场景:
为了安全着想,存入数据库的密码是加密后存入的,但是现在需要从数据库中获取账号和密码来调用封装的第三方接口来获取关键参数,此时密码信息就需要是解密的,但是如果从每个调用的地方都来一次解密,又显得有点累赘。所以就重写Model的init方法来达到目的。
from django.db import models class Company(models.Model): name = models.CharField(u公司名称, max_length=64, null=False) account = models.CharField(u登陆账号, max_length=64, null=False) passwd = models.CharField(u登陆密码, max_length=64, null=False) address = models.CharField(u住址, max_length=64, null=False) phone = models.CharField(u电话号码, max_length=11, null=False) email = models.EmailField(u邮箱, max_length=64, null=False) class Meta: verbose_name = "公司" verbose_name = verbose_name db_table = "business_company"
改写方法:
from django.db import models from utils import AESCipher # 自己定义的AES的加解密类 class Company(models.Model): name = models.CharField(u公司名称, max_length=64, null=False) account = models.CharField(u登陆账号, max_length=64, null=False) passwd = models.CharField(u登陆密码, max_length=64, null=False) address = models.CharField(u住址, max_length=64, null=False) phone = models.CharField(u电话号码, max_length=11, null=False) email = models.EmailField(u邮箱, max_length=64, null=False) class Meta: verbose_name = "公司" verbose_name = verbose_name db_table = "business_company" # 重写此方法 def __init__(self, *args, **keargs): fields_iter = iter(self._meta.concrete_fields) new_args = list() for val, field in zip(args, fields_iter): if field.attname == "passwd": new_args.append(AESCipher().decrypt(val)) else: new_args.append(val) super(Company, self).__init__(*tuple(new_args), **kwargs)