Python 按键查询时分页导致ndb问题

Python 按键查询时分页导致ndb问题,python,google-app-engine,Python,Google App Engine,场景是,我需要从数据存储中检索一些数据,模型是: class Player(ndb.Model): """Models an individual Player with key.""" chatId = ndb.StringProperty() nickname = ndb.StringProperty() firstName = ndb.StringProperty() lastName = ndb.StringProperty() profi

场景是,我需要从数据存储中检索一些数据,模型是:

class Player(ndb.Model):
    """Models an individual Player with key."""
    chatId = ndb.StringProperty()
    nickname = ndb.StringProperty()
    firstName = ndb.StringProperty()
    lastName = ndb.StringProperty()
    profilePic = ndb.StringProperty()
    conversationStatus = ndb.IntegerProperty(default=ConversationStatus.IDLE)
    contacts = ndb.KeyProperty(kind="Player", repeated=True)
我想使用“联系人”属性中的键检索玩家

“pageSearchResults”功能旨在根据页面大小显示有限的结果集。该函数定义如下

prevCursorStr = payload['prev_cursor'] if 'prev_cursor' in payload else ""
nextCursorStr = payload['next_cursor'] if 'next_cursor' in payload else ""
players = []
resultsToFetch = 2

if not prevCursorStr and not nextCursorStr:
    players, next_cursor, more = query.order(Player.key).fetch_page(resultsToFetch)
    prevCursorStr = ""
    if next_cursor:
        nextCursorStr = next_cursor.urlsafe() 
    else:
        next_cursor_str = ""
    next_ = True if more else False
    prev = False
elif nextCursorStr:
    cursor = ndb.Cursor(urlsafe=nextCursorStr)
    players, next_cursor, more = query.order(Player.key).fetch_page(resultsToFetch, start_cursor=cursor)
    prevCursorStr = nextCursorStr
    nextCursorStr = next_cursor.urlsafe()
    prev = True
    next_ = True if more else False
elif prevCursorStr:
    cursor = ndb.Cursor(urlsafe=prevCursorStr)
    players, next_cursor, more = query.order(-Player.key).fetch_page(resultsToFetch, start_cursor=cursor)
    players.reverse()
    nextCursorStr = prevCursorStr
    prevCursorStr = next_cursor.urlsafe()
    prev = True if more else False
    next_ = True



result = {
    'players': players,
    'search': payload['search'] if 'search' in payload else "",
    'next_cursor': nextCursorStr if next_ else "",
    'prev_cursor': prevCursorStr if prev else "",
}


return result
让我们假设我执行以下操作:

keys = player.contacts
query = Player.query(Player.key.IN(keys))
return self.pageSearchResults(query, payload)
在本例中,我遇到了一个奇怪的问题,分页按顺序正确工作,它会返回结果列表,如: 1,2,->下一页 下一页 这是不正确的

现在,如果我查询一个不是KeyProperty的属性,问题就消失了

出于调试目的,我将此代码添加到前面的代码段中

keys = player.contacts
chatids = []
for key in keys:
    player = key.get()
    chatids.append(player.chatId)

query = Player.query(Player.chatId.IN(chatIds))
return self.pageSearchResults(query, payload)
在本例中,我查询chatidstringproperty,分页就像一个符咒


我真的不明白这里发生了什么,有人能帮我吗?

模型的关键属性应该通过以下方式进行过滤:

keys = player.contacts
query = Player.query(Player._key.IN(keys))
return self.pageSearchResults(query, payload)
注意
\u键
。对于与密钥匹配的联系人:


query=Player.query(Player.contacts.IN(keys))

谢谢,但是做了一些测试,我通过
chatdIds=Player.contacts query=Player.query(Player.chatdid.IN(chatdIds))
这里,chatdid也不是一个列表,但它与IN filter一起工作,这与我以前尝试做的有什么不同?我无法理解这里的要点…使用StringProperty chatId查询IN时会得到什么结果?我会在给定的chatId列表中列出具有chatId属性的所有玩家实体。查询中的ndb在OR语句中执行多个相等过滤器。因此,按“property.IN(list)”进行查询就像查询“property==list[0]”等。要按实体的键属性进行筛选,请尝试:
query=User.query().filter(User.\u key>ndb.key('User',key\u id))
。注意
\u键
。修改答案以匹配注释。