0

im not 100% уверены в этом, но в моем мнении У запросов NDB возникают проблемы, когда используется sortBy a ComputedProperty. В моем примере ниже сортировка по name работает без ожиданий, а сортировка по numberOfProducts не возвращает никаких данных. Однако, если я сортирую по name, вернутся правильные значения для numberOfProducts, что означает, что сама модель и база данных в порядке.NDB SortBy нет результатов для ComputedProperty

My Model:

class Brand(ndb.Model): 
    name = ndb.StringProperty() 
    products = ndb.ComputedProperty(lambda self: Product.query(Product.brand==self.key).fetch(keys_only=True)) 
    numberOfProducts = ndb.ComputedProperty(lambda self: len(self.products)) 

Мои запросы:

sortBy = Brand._properties[args['sortBy']] 
query = query.order(-sortBy if args['asc'] == '0' else +sortBy) 
entities, cursor, more = query.fetch_page(20, start_cursor=Cursor(urlsafe=args['cursor'])) 

Спасибо большое за любой повод для размышлений.

+0

Я предлагаю вам выполнить простой пример сортировки запроса по вычисленному свойству. (т. е. удалить другое возможное поведение переменной) и посмотреть, можете ли вы правильно сортировать. Также откуда идет запрос. например, 'Brand.query(). order (-Brand.numberOfProducts)' –

+0

Неплохо, я не упоминал, я попробовал именно тот запрос, о котором вы упомянули, я тоже не получаю никаких сущностей. Я также не получаю никаких ошибок/предупреждений, я просто получаю пустой результат. – lkshrk

+0

Итак, как определяется запрос? –

ответ

0

Хорошо, я нашел проблему, даже если не знаю, почему это приводит к неожиданному поведению. В основном мой computedProperty products вызывает проблему:

products = ndb.ComputedProperty(lambda self: Product.query(Product.brand==self.key).fetch(keys_only=True)) 

Этот запрос возвращает list ключей и, следовательно, свойство нуждается в repeated аргумент, который нужно установить. Кто-нибудь знает, в чем причина, почему эта ошибка приводит к моей ошибке?

+0

Этот код вернет список ключей. И ComputedProperty не по умолчанию хранит списки. Также это вычислимое свойство действительно неэффективно. Он всегда будет оценивать, когда вы извлекаете запись. Я не думаю, что вы намерены. Таким образом, единственное свойство 'products' будет иметься, если вы используете его в индексе (т. Е. Подделываете соединение). –

+0

Я полностью понимаю ошибку, но я не понимаю, почему это привело к моей описанной ошибке. В моем случае я хочу вычислить это каждый раз, когда я запрашиваю бренд, потому что я хочу быть уверенным, что всегда получаю и up2date список productKeys. Насколько я вижу, это самый эффективный способ сделать это? – lkshrk

+0

Я полагаю, что если вы «каждый» раз, когда вы получаете сущность, которую вы действительно хотите выполнить, тогда да, это разумно эффективно. Однако нет смысла хранить список ключей. Вы хотели бы только сохранить len. Кроме того, вы можете лучше использовать «post_get» и выполнить запрос с этим подходом, вместо того, чтобы хранить избыточную информацию. –

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

  • Нет связанных вопросов^_^