1

我尝试运行的几个查询有一个奇怪的问题。

我已经构建了一个方法,它从查询中返回一个结果元组-

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

问题是,每次调用的结果都是相同的。即使产品被删除或在产品属性“活动”中更改为“假”。只有当我重新启动 sdk 服务器时才会刷新结果。在生产中,它只是在我更改版本之前不会改变。

我在另一个查询中看到了类似的问题,其中查询属性是 BooleanProperty。

关于如何解决这个问题的任何想法?

编辑:我在一个小费应用程序中使用该方法。它用于填充 wtforms 中的选择字段。'choices' 基本上接受元组(值,名称)对的列表。

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

我对编辑没有任何问题。当我从管理员端检查时,我可以看到某些产品设置为“假”。即使我清空(删除)整个产品列表,我也会得到与第一次相同的列表。

我没有在应用程序的任何地方使用缓存。

4

2 回答 2

2

您的类定义在实例启动时被 App Engine 运行时缓存,默认设置为实例启动时的状态。要使选择动态化,您需要在运行时设置它们。

wtforms(tipfy 使用的是 IIRC)文档中的示例;需要针对 App Engine 查询进行调整:

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

当您创建表单时,该函数会被调用一次。

你可以重载表单__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 回答