Googleアプリエンジン(Python)とJinja2を使用しています。通貨の国際化とローカリゼーションのためのwebapp2の機能を利用したいと思います。 webapp2の組み込みi18nメソッド。次に、私は自分の価格の正しいデータ型を持っていなければなりません。GAE + WTFormsの価格である番号を扱う
価格のStringを使用したプロトタイプから、実際の実装に価格を変換する別の変数+通貨である別の変数を使用しています。その間、私は両方の変数を使用して、文字列をインストールした番号を使用してマイグレーションを行い、文字列データ型を削除し、古いエンティティを整数または小数のような数値ベースの変数に更新するmapreduceジョブを作成します。 text /価格を表す文字列。
私の環境(Googleのアプリケーションエンジン)は10進数のデータ型をサポートしていないため、整数が使用されるのは、借金が増えている物件や、住宅、車など、私は小数点以下のプロパティを実装するプロジェクトを中止しましたが、とにかく迷子になっていましたが、今は価格を設定する正しい方法と、保存する前にキャストする必要があるかどうかを尋ねます。
e。
form = EntityForm(self.request.params)
if form.validate():
entity.title = form.title.data
entity.name = form.name.data
entity.email = form.email.data
entity.text = form.text.data
entity.set_password(form.password.data)
entity.price = form.price.data
try:
if form.price.data:
form.price.data=form.price.data.replace(',','.').replace(' ', '')
entity.integer_price = int(form.price.data)
except:
pass
変数を整数にキャストする必要はありませんか、型変換は背後で処理されますか?私は、フォーム変数は文字列であり、価格はソートされ適切にフィルタリングされる数値でなければならないと考えています。私は私にカスタムメイドの小数プロパティを使用していた場合は
私はこのエラーを取得開始しました:
Traceback (most recent call last):
File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 545, in dispatch
return method(*args, **kwargs)
File "/base/data/home/apps/s~montaoproject/validation.355292363398040911/i18n.py", line 653, in get
ads = paginator.page(page)
File "/base/data/home/apps/s~montaoproject/validation.355292363398040911/paginator.py", line 42, in page
return Page(self.object_list[bottom:top], number, self)
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 2189, in __getitem__
return self.fetch(limit, start)
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 2084, in fetch
return list(self.run(limit=limit, offset=offset, **kwargs))
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 2237, in next
return self.__model_class.from_entity(self.__iterator.next())
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/search/__init__.py", line 463, in from_entity
return super(SearchableModel, cls).from_entity(entity)
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 1411, in from_entity
entity_values = cls._load_entity_values(entity)
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 1387, in _load_entity_values
value = prop.make_value_from_datastore(entity[prop.name])
File "/base/data/home/apps/s~montaoproject/validation.355292363398040911/main.py", line 98, in make_value_from_datastore
return decimal.Decimal(value)
File "/base/python27_runtime/python27_dist/lib/python2.7/decimal.py", line 548, in __new__
"Invalid literal for Decimal: %r" % value)
File "/base/python27_runtime/python27_dist/lib/python2.7/decimal.py", line 3844, in _raise_error
raise error(explanation)
InvalidOperation: Invalid literal for Decimal: u''
私が使っていたコードはでした:
class DecimalProperty(db.Property):
data_type = decimal.Decimal
def get_value_for_datastore(self, model_instance):
return str(super(DecimalProperty, self).get_value_for_datastore(model_instance))
def make_value_from_datastore(self, value):
return decimal.Decimal(value)
def validate(self, value):
value = super(DecimalProperty, self).validate(value)
if value is None or isinstance(value, decimal.Decimal):
return value
elif isinstance(value, basestring):
return decimal.Decimal(value)
raise db.BadValueError("Property %s must be a Decimal or string." % self.name)
しかし、これは私のために動作しませんでした、私は "None"という言葉を記事/オブジェクトの文字列として取得していましたが、これは私のアプリケーションが正しく読み込まれないようにしましたので、10進数の試みを完全に削除して、代わりにintegerpropertyを使って解決して、空でもよいし、wtformsでできる整数でもよい。
私は整数小数点をもう使用していません。通貨の一部が必要な場合はintegerpropertyが、最悪の場合は別の変数 "cents"を使用してドルと整数の整数を使用できます後者はまれに使用されることはありません。
だから私は今、計画しています解決策は単純です:
クラス条(GeoModel、search.SearchableModel):
integer_price = IntegerProperty() #store dollars as dollars
currency = db.StringProperty(choices=(
'EUR',
'ARS',
'AUD',
'BRL',
'GBP',
'CAD',
'CZK',
'DKK',
'HKD',
'HUF',
'ILS',
'INR',
'JPY',
'MXN',
'NZD',
'NOK',
'PLN',
'PHP',
'SGD',
'SEK',
'SGD',
'CHF',
'USD',
'THB',
'TWB',
), verbose_name='Currency')
price = db.StringProperty(verbose_name='price') #quit using this and use a number instead
私は実際に型変換やその他をしなければならない場合、あなたは知っていますか私が落ちる可能性のある落とし穴?あなたが私の許可なくしなければならないよりエキゾチックな価格設定が考えられますが、私のユースケース(車の宣伝、家の宣伝など)に小数点は必要ないことに同意しますか? 「1ガロン当たり20ドル」というのは、私が扱うことのできない価格ですが、それは特別なタイプの価格(単位体積あたり)であり、同様に価格がセントであるためテキストで指定することができます。 integerpropertyとして価格を格納すると、私のアプリケーションが国際化され、ローカライズされて以来、価格のフォーマットをはるかに改善できます。
どんな答えてくれてありがとうまたは
'decimal'を使いたい場合は、コードに含めることができ、小数点以下のオブジェクトをstrに変更するだけです。ネイティブ環境で10進数を持つ場合、それをインポートするとき、 'decimal .__ file__'のパスには、未処理のソース(またはコンパイルされたソース)が含まれます。それをあなたのアプリケーションエンジンディレクトリにコピーすることができます。 (私はウェブ上で10進数のソースを見つけようとしています)。 – bossylobster