1

実行しようとしているいくつかのクエリに奇妙な問題があります。

クエリから結果のタプルを返すメソッドを作成しました-

def get_activeproducts():
    query = Product.gql("WHERE active = True")
    choices = []
    for obj in query:
        choices.append((str(obj.key()), obj.name))
    return choices

問題は、結果は各呼び出しで同じであるということです。商品属性「active」で商品が削除または「False」に変更された場合でも。結果は、SDKサーバーを再起動したときにのみ更新されます。本番環境では、バージョンを変更するまで変更されません。

クエリプロパティがBooleanPropertyであるもう1つのクエリで同様の問題が発生しました。

これをどのように修正できるかについてのアイデアはありますか?

編集:私はtipfyアプリケーションでメソッドを使用しています。wtformsの選択フィールドに入力するために使用されます。'choices'は基本的に、タプル(値、名前)のペアのリストを取ります。

class InvoiceForm(Form):
    product = SelectField('Product', choices=get_activeproducts())

編集に問題はありません。管理者側から確認すると、特定の製品が「False」に設定されていることがわかります。また、製品のリスト全体を空(削除)にしても、最初に取得したのと同じリストを取得します。

アプリケーションのどこでもキャッシュを使用していません。

4

2 に答える 2

2

クラス定義は、インスタンスの起動時にApp Engineランタイムによってキャッシュされ、デフォルトはインスタンスの起動時の状態に設定されます。選択を動的にするには、実行時にそれらを設定する必要があります。

wtforms(IIRCはtipfyが使用しているもの)ドキュメントからの例。AppEngineクエリ用に調整する必要があります。

class UserDetails(Form):
    group_id = SelectField(u'Group', coerce=int)

def edit_user(request, id):
    user = User.query.get(id)
    form = UserDetails(request.POST, obj=user)
    form.group_id.choices = [(g.id, g.name) for g in Group.query.order_by('name')]
于 2011-02-22T14:21:59.650 に答える
0

フォームを作成すると、関数が 1 回呼び出されます。

フォーム__init__.py関数をオーバーロードして、これをきれいに行うことができます

class InvoiceForm(Form):
    product = SelectField(u'Group', choices=[])

    def __init__(self, product_select, *args, **kwargs)
        super(InvoiceForm, self).__init__(*args, **kwargs)
        self.product.choices = select_dict

----
form = InvoiceForm(product_select=get_activeproducts())
于 2011-02-22T19:27:26.657 に答える