1

ndb モデルにクラス メソッドがあり、「ユーザー」(問題ありません) と「業界」でフィルタリングしています。

問題は、エンティティRecommendationには業界プロパティがなく、Stock の KeyProperty である Stock プロパティがあり、Stock業界プロパティがあることです。

get_last_n_recommendations_for_user_and_industryメソッドを修正して、業種 (株式の KeyProperty) でフィルタリングするにはどうすればよいですか??

class Industry(ndb.Model):
    name = ndb.StringProperty()
    ...

class Stock(ndb.Model):
    name = ndb.StringProperty()
    industry = ndb.KeyProperty(kind=Industry)
    ...

    @classmethod
    def get_industry(cls):
        return cls.query(cls.ticker == cls).get().industry

class Recommendation(ndb.Model):
    user = ndb.KeyProperty(kind=User)
    stock = ndb.KeyProperty(kind=Stock)
    ...

    @classmethod
    def get_last_n_recommendations_for_user_and_industry(cls, stock_key, user_key, n):
        return cls.query(
                cls.user == user_key, 
                cls.stock.get().industry == ndb.Key('Stock', stock_key.string_id()).get().industry
            )
            .fetch(page_size)

これを行うと、次のエラーが発生します。

AttributeError: 'KeyProperty' object has no attribute 'get'
4

1 に答える 1

6

参照プロパティの属性でフィルター処理/クエリを実行することはできません。業界の属性をレコメンデーション モデルに追加してクエリを実行する必要があります。

class Recommendation(ndb.Model):
  user = ndb.KeyProperty(kind=User)
  stock = ndb.KeyProperty(kind=Stock)
  industry = ndb.ComputedProperty(lambda e:  
    Stock.industry.get_value_for_datastore(e.stock))

  @classmethod
  def get_last_n_recommendations_for_user_and_industry(cls, industry_key, user_key, n):
    return cls.query(
            cls.user == user_key, 
            cls.industry == ndb.Key('Stock', stock_key.string_id()).get().industry
        )
        .fetch(page_size)
于 2012-07-23T06:47:29.723 に答える