0

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として価格を格納すると、私のアプリケーションが国際化され、ローカライズされて以来、価格のフォーマットをはるかに改善できます。

どんな答えてくれてありがとうまたは

+0

'decimal'を使いたい場合は、コードに含めることができ、小数点以下のオブジェクトをstrに変更するだけです。ネイティブ環境で10進数を持つ場合、それをインポートするとき、 'decimal .__ file__'のパスには、未処理のソース(またはコンパイルされたソース)が含まれます。それをあなたのアプリケーションエンジンディレクトリにコピーすることができます。 (私はウェブ上で10進数のソースを見つけようとしています)。 – bossylobster

答えて

1

コメント発行番号6595を見ているともthisしてください。あなたの問題がこの領域にある場合は、それ以外の部分で領域を捕捉し、esp変数をダンプすることを提案するパッチ以外で解決できる可能性があります。小数点に渡されるものは正当な許容文字です。私にとっては、その文字が空文字であるという文字が少し奇妙に見えるので、ここではUnicodeを扱っているので、すべての文字が有効であることを確認しようとします。

関連する問題