【问题标题】:How to get latest and adjacent records from the datastore?如何从数据存储中获取最新和相邻的记录?
【发布时间】:2012-08-06 05:17:05
【问题描述】:

我有电影数据存储,那里的每条记录都有自己的 id 作为键名,如下所示:

12345
32453
12154
78873
34543

我想允许用户一部一部地浏览电影。首先,应该显示最新的电影(数据库有字段added 带有日期和时间)。如何从数据存储中获取它? 更新。我可以这样做:

movies = Movies.query()
movies.order(-Movies.added)
for movie in movies.fetch(1):
    self.response.out.write(movie.key.id())

但我不喜欢它——为了获得密钥,我请求了整个记录。

其次,如果放映了其他电影(例如,12154),用户应该能够转到上一部电影(id 32453)和下一部电影(id 78873)。当然,如果放映了上一部电影,就没有下一部电影了;如果播放第一部电影,则不会有上一部电影。那么,问题是如何获取下一部电影和上一部电影的关键名称? 更新。如果当前放映的电影是 12154,那么我应该为上一部电影生成类似 example.com/movie/32453 的链接,为下一部电影生成类似 example.com/movie/78873 的链接。

更新。我尝试过类似以下的方法:

next_movie = Movies.query(Movies.added < movie.added)
next_movie = next_movie.order(-Movies.added)
next_movie = next_movie.get()
if next_movie:
    next_url = next_movie.key.id()
else:
    next_url = ''

prev_movie = Movies.query(Movies.added > movie.added)
prev_movie = prev_movie.order(-Movies.added)
prev_movie = prev_movie.get()
if prev_movie:
    prev_url = prev_movie.key.id()
else:
    prev_url = ''

但是效果不好...next_url 似乎还可以,但prev_url 总是一样。这是我的测试数据库内容(-Movies.added order):

id      added
503035: 2012-08-05 19:49:51.259000
475537: 2012-08-05 19:49:51.238000
677539: 2012-08-05 19:49:51.218000
566355: 2012-08-05 19:49:51.197000
557850: 2012-08-05 19:49:51.176000
670146: 2012-08-05 19:49:51.155000
581030: 2012-08-05 19:49:51.135000
464561: 2012-08-05 19:49:51.114000
507817: 2012-08-05 19:49:51.092000

【问题讨论】:

  • 您的问题应该更具体一点。你在用什么JDO,Objectify,DataNucleaus,低级访问,未定?
  • 从他使用 Python NDB 的标签来看。
  • @user1258245,是的,我使用 NDB。

标签: google-app-engine google-cloud-datastore app-engine-ndb


【解决方案1】:

首先,您需要电影实体上的一个属性来表示“迟到”,例如电影插入数据库的日期。

那么你应该在这个字段上使用降序查询。

要跳到下一个/上一个,您应该使用Query Cursors

【讨论】:

  • 他已经在问题中说他有一个“添加”字段。
  • 我已经更新了关于第一部分的问题。如何申请keys_onlyMovies.query(keys_only = True) 不起作用 - 意外的关键字参数“keys_only”。
  • 好的,我应该像fetch(1, keys_only = True)一样应用它。
  • 关于第二部分 - 看起来游标对我不起作用,因为我应该生成人类可读的 url 而.urlsafe() 不行。
【解决方案2】:

以下代码运行良好:

next_movie = Movies.query(Movies.added < movie.added)
next_movie = next_movie.order(-Movies.added)
next_movie = next_movie.get(keys_only = True)
if next_movie:
    next_url = next_movie.id()
else:
    next_url = ''

prev_movie = Movies.query(Movies.added > movie.added)
prev_movie = prev_movie.order(Movies.added)
prev_movie = prev_movie.get(keys_only = True)
if prev_movie:
    prev_url = prev_movie.id()
else:
    prev_url = ''
return next_url, prev_url

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2016-09-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 2018-10-17
    相关资源
    最近更新 更多