これは、私の 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()