当前位置: 首页 > 面试题库 >

由于cursor()方法中“ IN过滤器”的局限性,使用游标进行分页查询会导致错误……该怎么办?

高茂
2023-03-14
问题内容

我正在通过使用以下模型开发类似微博系统的Twitter:

class Member(db.Model):    
    user = db.UserProperty(required=True)
    follower_count = db.IntegerProperty(default=0) # members following you    
    following_count = db.IntegerProperty(default=0) # members you are following

class NewsItem(db.Model):    
    text = db.StringProperty(required=True)
    posted_by = db.ReferenceProperty(reference_class=Member,required=True,collection_name="posted_items")
    posted_on = db.DateTimeProperty(auto_now_add=True)
    status = db.IntegerProperty(default=1) # 0: deleted

class Follow(db.Model):    
    member = db.ReferenceProperty(reference_class=Member,required=True,collection_name="followings")    
    followed_member = db.ReferenceProperty(reference_class=Member,required=True,collection_name="followers")    
    added_on = db.DateTimeProperty(auto_now_add=True)

在此模型结构中,我使用以下代码检索当前用户遵循的成员的消息

follow_log_list = Follow.gql('WHERE member = :1 ', member)
followed_member_list = []
for follow_log in follow_log_list:
    followed_member_list.append(follow_log.followed_member)

query = NewsItem.all()
query.filter('posted_by IN', followed_member_list)
query.filter('status =', 1)
query.order('-posted_on')
query.with_cursor(cursor)   
newsList = query.fetch(10)

template_values['cursor'] = query.cursor()

调用query.cursor()方法时,出现以下错误:

“没有游标可用于MultiQuery(使用“ IN”或“!=“运算符进行查询)”

这是正常现象,因为在游标的文档中此限制明确表示为:

http://code.google.com/appengine/docs/python/datastore/queries.html

“不能在使用IN或!=过滤运算符的查询中使用游标。”

获取关注成员职位的替代方法是什么?

谢谢,

编辑:已发布消息按其状态过滤,并按其发布日期排序…但是示例未在此处显示,我已对其进行了更改…


问题答案:

我的解决方案是将日期值像光标一样使用,正如我描述的那样,它是对尼克森的答案的注释…就像这样:

if cursor: # This is not actually a cursor! It is base64 datetime string
  cursordate = _strptime(base64.b64decode(cursor)) # _strptime is a local method that converts str to datetime

# IN has a limit for lists: 30 items allowed
listofNewsLists = []
listofMemberLists = [followed_member_list[i:i+30] for i in range(0, len(followed_member_list), 30)]
for eachList in listofMemberLists:
   query = NewsItem.all()
   query.filter('posted_by IN', eachList).filter('status =', 1)
   if cursor:
      query.filter('posted_on <', cursordate)
   query.order('-posted_on')                        
   listofNewsLists.append(query.fetch(PAGE_SIZE))

  newsList = []
  if listofNewsLists:
    emptyListCount = 0
    while len(newsList) < PAGE_SIZE and emptyListCount < len(listofNewsLists):
      max = datetime.datetime.min
      maxInd = -1
      emptyListCount = 0
      for i in range(len(listofNewsLists)):
        if listofNewsLists[i] == []:
          emptyListCount += 1
        elif listofNewsLists[i][0].posted_on > max:
          max = listofNewsLists[i][0].posted_on
          maxInd = i
      if max > datetime.datetime.min:
        newsList.append(listofNewsLists[maxInd].pop(0))

template_values['cursor'] = base64.b64encode(newsList[-1].posted_on.isoformat())

那是; 我将最后显示的项目的日期值存储为新列表的起点…

除非我有具有相同post_on值的项目,否则这很好(我猜)。



 类似资料:
  • 假设我的应用程序正在管理名为workload的对象,具有以下字段。我想公开一个REST接口,让用户通过标签查询工作负载。 问题:我如何设计RESTendpoint,使它能够通过多个标签作为过滤器来支持查询工作负载? 或者,我可以,但每次只能使用一个标签。 示例查询2:我想 标签为“A”或“B”但没有“C”的所有工作负载 完全不知道如何执行这种rest api,除了要求用户分别由A、B、C进行查询,

  • 问题内容: 我有一个查询,看起来像这样: 这就是我将数据显示给我的方式。 我正在尝试使用此处指定的分页,但无法解决。 有没有一种方法可以通过使用组合查询游标来对查询进行分页?这有可能吗? 问题答案: 正如@FrankvanPuffelen在您之前的问题]中已经回答的那样,您无法实现这一点,因为在您的情况下,您应该将2个不同的查询(和)传递给单个适配器,而使用不能实现。您可以将第一个查询或第二个查询

  • 我有一个基于spring的java web应用程序,它使用HSQLDB dbms后端在事务中插入大量记录。为了减少为要插入的记录生成主键的往返次数,我想创建一个存储过程,生成主键,在插入之前将其用作标识符。因此,我用以下代码创建了一个存储过程: 有一个序列GENERATE_PKS_SEQ,用于为要插入的记录生成唯一标识符。此存储过程需要一个数字输入(NUMBEROFIDS)来定义要生成的密钥数。

  • 问题内容: 我正在编写一个PL / SQL过程,该过程需要动态生成一些查询,其中之一涉及使用来自查询的结果作为参数来创建临时表。 它可以正确编译,但是即使使用非常简单的查询,例如: IT抛出。如果我手动运行创建的查询,它将正确运行。在这一点上,我能够确定是什么导致了问题。 问题答案: 尝试丢掉“;” 从您立即执行的字符串内部。

  • 问题内容: 我正在使用该软件包在列表视图中提供搜索功能。 现在,我还要向该视图添加分页。 我正在尝试将分页与过滤后的查询集结合起来,但是我不知道如何继续。 到目前为止,我已经尝试了以下方法: 问题答案: 要使用Django过滤器并对过滤后的结果进行分页,你可以执行以下操作: 为你的模型创建一个过滤器类: 开 每个对象都有一个包含过滤查询集的属性,如果需要,你甚至可以覆盖它。 我们将对我们的财产进行

  • 问题内容: 我有一个, 并且需要根据外部数据在控制器和视图之间进行选择,因此我使用和。 如果我只有它,一切都很好,但是当我添加时,会出现此错误: 可能看起来有些像(它说有对象,但看起来像,但是我不太擅长调试) 这是我的代码: 编辑 基于RadimKöhlers答案的更改 新错误: 解 这至少需要版本的 问题答案: 问题是,这只是必须返回 对象 代表或 (它的名字) http://angular-u