我尝试运行的几个查询遇到了奇怪的问题。
我构建了一个方法,它返回查询结果的元组-
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。
知道如何解决这个问题吗?
编辑: 我正在一个tipfy应用程序中使用该方法。它用于填充 wtforms 中的选择字段。 “choices”基本上接受元组(值、名称)对的列表。
class InvoiceForm(Form):
product = SelectField('Product', choices=get_activeproducts())
我对编辑没有任何问题。当我从管理端检查时,我可以看到某些产品被设置为“False”。即使我清空(删除)整个产品列表,我也会得到与第一次相同的列表。
我没有在应用程序的任何地方使用缓存。
最佳答案
当实例启动时,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')]
关于python - App Engine 数据存储区查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5077274/