0

これは100%確信していませんが、私の意見では、sortByComputedPropertyを使用するとNDBクエリに問題があります。 私の例では、nameのソートは期待通りに機能せず、numberOfProductsでソートするとエントリは返されません。しかし、私がnameでソートすると、numberOfProductsの正しい値が返されます。これは、モデル自体とデータベースが適切であることを意味します。NDB SortBy ComputedPropertyの結果はありません

マイモデル:

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

これはなぜこの予期しない動作につながるのかわからない場合でも、問題が見つかりました。 基本的な問題が発生するproducts私computedProperty:

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

このクエリは、キーのlistを返すので、プロパティを設定するrepeated引数を必要とします。誰もがこのエラーが私のエラーにつながる原因は何ですか?

+0

そのコードはキーのリストを返します。 ComputedPropertyでは、デフォルトではストアリストはありません。また、この計算されたプロパティは実際には非効率的です。レコードの取得時には常に評価されます。私はあなたが思っているものだとは思わない。だから、 'products'プロパティが持つ唯一の値は、あなたがインデックスでそれを使う(つまり、結合を偽装する)場合です。 –

+0

私は間違いを完全に理解していますが、なぜこれが私の記述されたエラーにつながったのか分かりません。 私の場合、私はいつもプロダクトキーのリストを取得しup2dateすることを確認したいので、私はブランドを照会するたびにこれを計算したいと思います。私が見る限り、これを行う最も効率的な方法は何ですか? – lkshrk

+0

私はあなたが実際にクエリを実行したいエンティティを取得するたびに「毎回」、それが合理的に効率的であるとします。しかし、キーのリストを保管することは重要ではありません。あなたはlenだけを保存したいと思うでしょう。さらに、 'post_get'フックを使用して、冗長な情報を格納するのではなく、そのアプローチでクエリを実行する方がよいでしょう。 –

関連する問題