2

redditのようなサイトを構築しています。オブジェクトは評価によってソートされます。誰かがページネーションの実装を手伝ってくれることを望んでいました。最初に上位 20 個のオブジェクトをロードしたいだけです。次に、「次へ」ボタンをクリックすると、20 番目のオブジェクトの評価に基づいて、次の 20 個のオブジェクトが読み込まれます。Google ドキュメントは次のとおりです: https://developers.google.com/appengine/docs/python/datastore/queries?hl=en

これを行う方法を知っている人はいますか?またはそこに良いチュートリアルはありますか?

4

2 に答える 2

2

これは、カーソルと共にモデル インスタンスを取得するために使用している汎用関数です。この関数は、リクエストから読み取っているパラメーターを受け取ります。

def retrieve_dbs(query, order=None, limit=None, cursor=None, **filters):
  ''' Retrieves entities from datastore, by applying cursor pagination
  and equality filters. Returns dbs and more cursor value
  '''
  limit = limit or config.DEFAULT_DB_LIMIT
  cursor = Cursor.from_websafe_string(cursor) if cursor else None
  model_class = ndb.Model._kind_map[query.kind]
  if order:
    for o in order.split(','):
      if o.startswith('-'):
        query = query.order(-model_class._properties[o[1:]])
      else:
        query = query.order(model_class._properties[o])

  for prop in filters:
    if filters.get(prop, None) is None:
      continue
    if type(filters[prop]) == list:
      for value in filters[prop]:
        query = query.filter(model_class._properties[prop] == value)
    else:
      query = query.filter(model_class._properties[prop] == filters[prop])

  model_dbs, more_cursor, more = query.fetch_page(limit, start_cursor=cursor)
  more_cursor = more_cursor.to_websafe_string() if more else None
  return list(model_dbs), more_cursor

という風に呼ぶことができます。エクステンション entity_db および entity_dbs を使用して、変数がエンティティ オブジェクトを参照していることを示します。*_db および *_dbs は、1 つまたは複数の結果があるかどうかを定義します。

entity_dbs, entity_cursor = retrieve_dbs(
    model.Entity.query(),
    limit=limit,  # Your limit parameter
    cursor=cursor,  # The cursor if you want to grab a batch of next results
    order=order,
  )
于 2013-04-05T10:29:26.630 に答える
1

データストア クエリで limit=20 を使用し、その後カーソルを取得して次の 20 を取得する場合、これは非常に簡単です。

于 2013-04-05T00:23:03.303 に答える