Проблема с запросом хранилища данных в App Engine - PullRequest
1 голос
/ 22 февраля 2011

У меня странная проблема с парой запросов, которые я пытаюсь запустить.

Я построил метод, который возвращает кортеж результата из запроса-

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

Проблема в том, что результат одинаков для каждого вызова. Даже если товары удалены или изменены на «False» в атрибуте товара «active». Результат будет обновлен только при перезапуске сервера SDK. В производстве он просто не меняется, пока я не изменю версии.

Я видел похожую проблему с еще одним запросом, где свойство запроса имеет тип BooleanProperty.

Есть идеи, как это можно исправить?

EDIT: Я использую метод в приложении tipfy. Он используется для заполнения поля выбора в wtforms. 'Choices' в основном принимает список пар кортежей (value, name).

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

У меня нет проблем с редактированием. Когда я проверяю это со стороны администратора, я вижу, что для некоторых продуктов установлено значение «Ложь». И даже если я очищаю (удаляю) весь список товаров, я получаю тот же список, что и в первый раз.

Я нигде не использую кеширование в приложении.

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

Ваше определение класса кэшируется средой выполнения App Engine при запуске экземпляра, причем по умолчанию установлено то, что было при запуске экземпляра.Чтобы сделать выбор динамическим, вам нужно установить его во время выполнения.

Пример из wtforms (какой IIRC использует типфай) docs;необходимо настроить для запросов 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')]
0 голосов
/ 22 февраля 2011

при создании формы функция вызывается один раз.

вы можете перегрузить функцию формы __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())
...