这是我的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
。我们看到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()