这是给我的 Django 同志们的。
我正在尝试在 Django 1.6.5 和 MySQL 中构建一个应用程序,其中一些数据库字段被加密以尊重用户的隐私。我已成功安装django-extensions
并成功使用EncryptedCharField
来进行简单的保存和数据检索。
但是,我在使用EncryptedCharField
浮点数时遇到了问题。现在,简单的类型转换很有用——这个问题似乎不是那个问题。我试图从一个作为值的加密字段开始,通过添加/减去一些数字来更改值,然后将其保存回数据库。我已经设法减少和重现这样的错误:
>>> user_id = 1
>>> account = AccountCash.objects.get( id = 1 )
>>> account.id
1L
>>> account.portfolio_id
1L
>>> account.account_name
u'My Cash'
>>> account.current_value
u'200'
>>> account.current_value = account.current_value - 10
Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'unicode' and 'int'
在这里,account_name
和current_value
都是EncryptedCharField
s。我们看到这current_value
是一个 unicode,所以类型转换为float
应该(我认为)解决问题,就像在其他地方对我一样。
但是,这样做会导致另一个问题
>>> account.current_value = float(account.current_value) - 10
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Users/jasonnett/anaconda/envs/bb_env/lib/python2.7/site-packages/django/db/models/fields/subclassing.py", line 35, in __set__
obj.__dict__[self.field.name] = self.field.to_python(value)
File "/Users/jasonnett/anaconda/envs/bb_env/lib/python2.7/site-packages/django_extensions/db/fields/encrypted.py", line 69, in to_python
elif value and (value.startswith(self.prefix)):
AttributeError: 'float' object has no attribute 'startswith'
我无法弄清楚将浮点值分配给此处的加密字段与我最初设置值的位置有什么不同:
# Make the new account, passing in the portfolio it belongs to
new_account = AccountCash(
portfolio = portfolio,
account_name = newCashAccountForm.cleaned_data['account_name'],
starting_balance = newCashAccountForm.cleaned_data['starting_balance'],
current_value = newCashAccountForm.cleaned_data['starting_balance'],
)
new_account.save()