All posts

Django model层修改返回数据

使用场景: 为了安全着想,存入数据库的密码是加密后存入的,但是现在需要从数据库中获取账号和密码来调用封装的第三方接口来获取关键参数,此时密码信息就需要是解密的,但是如果从每个调用的地方都来一次解密,又显得有点累赘。所以就重写Model的init方法来达到目的。 from django.db import 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 = "公司"

verbosename = verbosename

dbtable = "businesscompany"

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

改写方法:

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 = "公司"

verbosename = verbosename

dbtable = "businesscompany"

重写此方法

def _init_(self, *args, **keargs):

fieldsiter = 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(newargs), **kwargs)

Discussion

No comments yet