Django自定义字段 - 从to_python方法获取模型字段

1 投票
2 回答
1794 浏览
提问于 2025-04-17 05:22

更新

我有一个自定义字段类:

class Binary(models.Field):
    __metaclass__ = models.SubfieldBase
    def get_prep_value(self, value):
       return encryptAES(key, iv_random, str(value))
    def to_python(self, value):
       return value
    def db_type(self, connection):
       return 'VARBINARY(900)'

这是我用的模型:

class Received(models.Model):
   user = models.ForeignKey(User, unique=False, editable=False)
   address = Binary(blank=True)
   aes_key = Binary(blank=True)
   iv = Binary(blank=True)      

我想用这个自定义字段类来加密和解密数据。当用户提交表单时,get_prep_value 方法需要对数据进行加密。在 Django 管理界面中,我需要 to_python 方法来解密更改视图中的数据字段。我在考虑对 to_python 方法做以下修改:

def to_python(self, value):
        return decryptAES(aes_key?, iv?, value)

我遇到的问题是,to_python 方法是逐个字段地处理每个值,而我需要的是字段本身的值,包括 aes_key 和 iv 字段,以便解密数据。我不知道怎么获取 aes_key 和 iv 字段,所以才会有问号。

希望这样能让事情更清楚。

2 个回答

0

如果 keyiv_randomname 这三个东西都是为了让这个字段在进出数据库时进行加密和解密所必需的,那它们就不应该分开成不同的字段。相反,你应该定义一个 Binary 类(这个名字真糟糕)来处理这三个值,确保它能产生或接受这三个值的组合。

1

根据你更新的问题,看来你想做的事情其实是行不通的。如果你希望某个字段能够自动加密和解密,那么所有需要的信息都必须存储在对应的数据库字段里(可以参考@DanielRoseman的回答)。这样一来,如果你的数据库被黑客入侵,加密的意义就大大降低了。不过,我想入侵者还是得想办法把这些信息拼凑在一起。

根本不可能把所需的信息分散存储在多个数据库字段中,然后让一个字段把所有信息整合起来进行解密。每个字段都是独立的。很明显,它们不能知道其他字段的信息,因为在某些情况下,其他字段可能根本不存在。

最好的办法是把加密后的值和解密所需的信息存储在标准的Django模型字段中,并创建一个模型方法来解密这个值,另一个方法来加密这个值。

撰写回答