2016-08-20 58 views
0

我有一个模型存储用户输入的数据库密码。因为我的应用需要连接到这些数据库。密码在数据库中被加密。但是,当它被检索时,我需要将decrypt函数应用于密码字段。我在哪里可以这样做,以便仅在查询数据库时才应用,而不是在保存字段时应用。Django ORM - 调整字段值返回

这里是我的模型:

class Databases(models.Model): 
    """ 
    Handles the storing of database connections 
    """ 
    # Initialize the encryption class 
    e = Encryption() 
    # Our unique id for the database 
    id = models.AutoField(primary_key=True) 
    # Database name to display to the user 
    database_display_name = models.CharField(max_length=128, db_index=True, unique=True) 
    # Database name 
    database_name = models.CharField(max_length=128, db_index=True) 
    # Database status 
    active = models.BooleanField(default=True, db_index=True) 
    # The host name 
    host = models.CharField(max_length=256) 
    # The default port 
    port = models.IntegerField(default=3306) 
    # The username for the database 
    username = models.CharField(max_length=128) 
    # The password for the database 
    password = models.CharField(max_length=256) 
    # Set the database type 
    database_type = models.CharField(max_length=64, db_index=True, default="mysql") 
    # Timestamps 
    created_at = models.DateTimeField(db_index=True) 
    updated_at = models.DateTimeField(db_index=True) 
    event_at = models.DateTimeField(db_index=True) 

    def get_password(self, obj): 
     print("Retrieving") 
     return Databases.e.decrypt(obj.password) 

    def save(self, *args, **kwargs): 
     """ 
     On save, update timestamps 
     """ 
     # If the record does not currently exist in the database 
     if not self.id: 
      self.created_at = timezone.now() 
     self.updated_at = timezone.now() 
     # Encrypt the password 
     self.password = Databases.e.encrypt(self.password) 

     return super(Databases, self).save(*args, **kwargs) 

    class Meta: 
     db_table = 'databases' 

这里是我的串行:

class DatabasesSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Databases 

回答

0

可以使get_password方法Databases类的property

@property 
    def get_password(self): 
     print("Retrieving") 
     return self.e.decrypt(self.password) 

那么你将能够在您的序列化程序中使用它:

class DatabasesSerializer(serializers.ModelSerializer): 
    get_password = serializers.ReadOnlyField() 
    class Meta: 
     model = Databases 
     fields = ('get_password', ...,) 
+0

我想我可能已经造成了一些困惑:我试图用self.e.decrypt(self.password)覆盖字段密码,以便每当使用密码字段时它会显示自己的结果.e.decrypt(self.password) – user2694306

+0

我建议不要在数据库中存储纯文本密码,如果有人获得未经授权的访问,您的所有数据库都将受到攻击。无论如何,如果你想以纯文本的形式存储它们,为什么还要在首先保存时加密? – rafalmp