0
@property 
def returns_an_int(self): 
    some_var = do_something_that_returns_int() 
    if some_var: 
     return int(some_var) 
    else: 
     return 0 

У меня есть свойство, используя приведенный выше код, который должен (и делает) возвращать int. (Я положил int casting на него, чтобы дважды проверить) Однако, когда я пытаюсь использовать его для заказа fetch, cls.query().order(cls.returns_an_int) Я получаю ошибку типа TypeError: order() expects a Property or query Order; received <property object at 0xsome-hex-address> - Я попытался использовать + или -, чтобы увидеть, могу ли я заставить его получить значение, потому что Я видел это в других вопросах, но это не сработало. Что я делаю не так? Я пропустил что-то основное, чтобы заставить его работать?AppEngine Python Тип NDB Ошибка на .order()

ответ

3

Когда вы запрашиваете хранилище данных, вам необходимо запросить один из различных ndb.Property types. Вы запрашиваете свойство vanilla python. Это не работает, потому что данные свойства python никогда не сохраняются в хранилище данных, поэтому хранилище данных не может упорядочить данные, о которых он не знает.

Трудно дать окончательный совет относительно того, как исправить это. Вы можете сделать запрос без .order и сортировок в коде клиента:

return sorted(cls.query(), key=lambda item: item.returns_an_int) 

, но это не будет работать для типов сущностей, которые имеют много сущности. Кроме того, можно изменить свойство к ndb.ComputedProperty:

@ndb.ComputedProperty 
def returns_an_int(self): 
    some_var = do_something_that_returns_int() 
    if some_var: 
     return int(some_var) 
    else: 
     return 0 

Недостаток здесь является то, что вы храните (и платить за) данные более хранилища данных, и вы также выполнить метод returns_an_int для каждого датастор пут. Если это быстрый метод для выполнения, это не должно быть проблемой, но если это медленный метод, вы можете начать замечать разницу.

+0

Спасибо! Я, вероятно, в конечном итоге меняю свои модели. – Rudi

Смежные вопросы