私は Google アプリ エンジン (python) と Jinja2 を使用しています。通貨の国際化とローカリゼーションに webapp2 の機能を利用したいと考えています。次に、最初に価格の正しいデータ型を用意する必要があります。
私は、価格に String を使用したプロトタイプから、価格に数値データ型 + 通貨である別の変数を使用する、より現実的な実装に移行しています。そのため、移行中は両方の変数を使用し、文字列の代わりに数値を使用するように移行し、文字列データ型を削除して、mapreduce ジョブを作成し、古いエンティティを整数や小数などの数値ベースの変数に更新します。テキスト / 価格を表す文字列。
私の環境 (Google アプリ エンジン) は 10 進データ型をサポートしていません。また、家や車などのより高価な商品やオブジェクトを売買するために使用するため、整数のみを使用することもできます。 00 としてのみリストされています。そのため、10 進数のプロパティを実装するプロジェクトを中止しましたが、とにかくバグがありました。価格を設定する正しい方法と、保存する前にキャストする必要があるかどうかを尋ねます。
すなわち。これは正しいです:
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
または、変数を整数にキャストする必要はなく、型変換は舞台裏で処理されますか? フォーム変数は文字列であり、適切にソートおよびフィルタリングするには価格を数値にする必要があると思います。
カスタムメイドの decimal プロパティを使用していたときに、次のエラーが発生し始めました。
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)
しかし、これは私にとってはうまくいきませんでした。価格設定のない記事/オブジェクトの文字列として「なし」という単語を取得し始めたため、アプリが正しく読み込まれなかったので、小数点以下の試行を完全に削除し、解決策を探します代わりに integerproperty を使用し、入力が空であるか、wtforms で実行できる整数であることを検証します。
したがって、私はもうカスタム小数を使用していません.integerpropertyで十分であり、最悪の場合、通貨の分数が必要な場合は、別の変数「セント」を使用して、ドルに整数、セントに整数を使用し、後者を使用することにしました。ほとんどまたはまったく使用されません。
だから私が今計画している解決策は簡単です:
class Article(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 ドル」というのは私には扱えない価格ですが、(単位体積あたりの) 特別なタイプの価格であり、価格がセントの場合も同様であるため、代わりにテキストで指定できます。私のアプリケーションは国際化およびローカライズされているため、価格を整数プロパティとして保存すると、特に価格のフォーマットが大幅に改善されます。
回答またはコメントをありがとう