自定义Django模型字段(延迟加密/解密)

时间:2014-01-29 21:10:50

标签: django django-models

是否存在可以覆盖的方法,只有在从数据库加载字段时才会调用该方法。

我有一个来自遗留表的加密字段,(没有前缀或识别格式,可以可靠地用于确定它是否加密。)

我的解密代码无法进入to_python函数,因为它不仅在从数据库加载时被调用。

更糟糕的是,我想使解密和加密变得懒惰,因此除非需要,否则我不必调用解密/加密。 (加密代码是ASP经典中的一种奇怪的AES风格,所以我创建了一个我可以从python调用的asp服务。而且速度很慢)我用django的懒函数来创建一个很好的decrypt_lazy函数但是却无法知道如果价值是加密的,我就会被卡住。

所以重申一下我的主要问题是......我是否可以在自定义模型字段上使用方法或钩子,仅当值来自数据库时才用于处理值。再次to_python对我来说不起作用,因为它被调用并从其他地方传递值。

1 个答案:

答案 0 :(得分:3)

当您需要字段的解密值时,您可以简单地使用@property方法 -

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    pin = models.CharField(max_length=30)

    @property
    def pin_decrypted(self):
        # decrypt self.pin and return
        return magic_decrypt_method(self.pin)

现在,您可以访问person.pinperson.pin_decrypted