使用 NDB 中的 Key 检索实体

2024-05-04

我有这样的结构:有章节的书籍(祖先=书)有页面(祖先=章节)

我很清楚,要通过 ID 搜索章节,我需要通过祖先查询来搜索书籍。今天我了解到,如果我拥有所有密钥,我可以直接检索实体,而无需先获取书籍,然后获取章节,然后获取页面,如下所示:

page_key = ndb.Key('Book', long(bookId), 'Chapter', long(chapterId), 'Page', long(pageId))
page = page_key.get()

我的疑问是:要通过例如页码获取页面,我必须首先获取章节吗?

例如 :

class Book(ndb.Model):
    name = ndb.StringProperty(required=True)

    # Search by id
    @classmethod
    def by_id(cls, id):
        return Book.get_by_id(long(id))

class Chapter(ndb.Model):
    name = ndb.StringProperty(required=True)

    # Search by id
    @classmethod
    def by_id(cls, id, book):
        return Chapter.get_by_id(long(id), parent=book.key)

class Page(ndb.Model):
    pageNumber = ndb.IntegerProperty(default=1)
    content = ndb.StringProperty(required=True)

    # Search by page
    @classmethod
    def by_page(cls, number, chapter):
        page = Page.query(ancestor=chapter.key)
        page = page.filter(Page.pageNumber == int(number))
        return page.get()

实际上,当我需要搜索页面以显示其内容时,我正在这样做:

getPage?bookId=5901353784180736&chapterId=5655612935372800&page=2

所以,在控制器中,我这样做:

def get(self):
    # Get the id parameters
    bookId = self.request.get('bookId')
    chapterId = self.request.get('chapterId')
    pageNumber = self.request.get('page')

    if bookId and chapterId and pageNumber:
        # Must be a digit
        if bookId.isdigit() and chapterId.isdigit() and pageNumber.isdigit():
            # Get the chapter
            chapter_key = ndb.Key('Book', long(bookId), 'Chapter', long(chapterId))
            chapter = chapter_key.get()

            if chapter:
                # Get the page
                page = Page.by_number(pageNumber, chapter)

这是正确的方法还是我缺少更好的方法,我只能访问数据存储,而不是两次?

如果这是正确的,我认为使用 NDB 的这种工作方式不会对数据存储产生任何影响,因为对此页面的重复调用总是会命中同一章节和页面的 NDB 缓存(因为我正在使用get()方法,它不是一个fetch()命令)。我的猜测对吗?


你可以通过做一个祖先来一次性做到这一点query,而不是 get:

chapter_key = ndb.Key('Book', long(bookId), 'Chapter', long(chapterId))
page = Page.query(Page.pageNumber==pageNumber, ancestor=chapter_key)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 NDB 中的 Key 检索实体 的相关文章

随机推荐

  • 更改列表视图中的确切滚动位置

    一直在网上寻找答案 但我还没有找到任何可以做到这一点的东西 我想以编程方式更改 WPF 列表视图中的确切位置 某种说法 ListView Scrollposition Y some value 我唯一能找到的就是将值更改为列表视图中的对象
  • ANTLR语法的迁移工具

    假设我有以下简单语法 查询 DSL grammar TestGrammar term textTerm textTerm Text T VALUE STRING T VALUE value STRING WS t r n gt skip 然
  • 如何在交叉表 Crystal Report 中添加 2 个汇总字段

    我使用水晶报告中的交叉表创建报告 我有如下图所示的列 我想要 2 个汇总列 数量和销售额 并在交叉表专家中添加 2 个汇总字段 但还是不行 如果我想将 4 的值分配给 3 交叉表专家 自定义样式 汇总字段 选择水平 选中显示标签 至少在我的
  • Linux 上的 Imagemagick 将 EMF 转换为 PNG

    我尝试在 Red Hat Enterprise Linux Server 5 5 Tikanga 上使用 Imagemagick 将 EMF 格式的图像转换为 PNG 但遇到以下错误 转换 此图像格式 thumbnail emf 没有解码委
  • 如何在heroku上设置django-compressor,离线压缩到S3

    我遵循了在 SO 和不同博客中找到的每一条 QA 建议 在我的开发机器上一切正常 但在 Heroku 上没有任何效果 这是我的设置 DEFAULT FILE STORAGE arena utils MediaRootS3BotoStorag
  • 在“id”类型的对象上找不到属性“”

    我越来越Property aVariable not found on object of type id当尝试读取或写入变量到数组时 难道不应该知道我添加的对象是什么类吗 还注意到它可以读取值NSLog anArray objectAtI
  • Azure WebApp - 获取 VNET 上连接的服务的私有 IP

    我在 VPN 内有一个 Azure WebApp 当我继续联网时 我看到这样的连接 当我单击 单击此处进行配置 时 它似乎已启动并正在运行 所以 一切看起来都很好 VPN 外部连接 但我在哪里可以找到此 Web 应用程序的内部 VPN IP
  • 为什么 getcwd() 在 __destruct() 中返回 / ?

    我刚刚注意到 如果在 destruct 魔术函数中调用 getcwd 返回 而在任何其他方法中它返回预期路径 你对此有解释吗 这是一种 SAPI 行为 脚本关闭期间调用的析构函数已发送 HTTP 标头 脚本关闭阶段的工作目录可能与某些 SA
  • 将 css 背景设置为本地存储中的图像

    我希望将 base64 格式的图像存储在密钥中的本地存储中ImgStorage在CSS背景中像这样 data image png base64 iVBORw0KGgoAAAANS 到目前为止 我尝试了两种方法 1 从存储加载并放入css标签
  • python中旋转图像:推断背景颜色

    我使用以下 python 代码旋转图像 from PIL import Image img Image open banana jpg rotated img rotate 10 rotated save banana rotated jp
  • 特定字段的自定义 Jackson 序列化器

    我希望为同一对象提供多个杰克逊反序列化器 所有这些都基于自定义注释 理想情况下 我有一个 POJO 例如 public class UserInfo Redacted String ssn String name 在 正常 条件下 我希望该
  • Chrome 21 不检查单选按钮

    我经过一番努力才发现这一点 所以我想我应该分享我所遇到的事情 这样其他人就可以从我的努力中受益 Firefox IE 和 chrome 19 我手边唯一的其他版本 没有这个问题 但 chrome 21 有 如果您有这个单选按钮
  • 未捕获的类型错误:提供您的根 Epic 来 createEpicMiddleware(rootEpic)

    我收到这个错误 未捕获的类型错误 将您的根 Epic 提供给createEpicMiddleware rootEpic 不再支持 而是使用epicMiddleware run rootEpic 简单使用时 import rxjs impor
  • SwiftUI withAnimation 完成回调

    我有一个基于某种状态的 swiftUI 动画 withAnimation linear duration 0 1 self someState newState 上述动画完成时是否会触发任何回调 如果有关于如何在 SwiftUI 中使用完成
  • 如何在 C++ 中重载数组的运算符<<?

    我正在尝试这样做 template
  • 多个构建配置可以共享一个配置转换吗?

    我正在使用 SlowCheetah 进行 XML 转换项目中的一堆配置文件 但是 这个相同的解决方案是负载平衡设置的一部分 其中不同服务器 在本例中为两个 之间的某些配置值有所不同 我有以下构建配置 Debug Release 发布 测试
  • 如何永久清除 linux/ubuntu 终端或 bash 中的所有历史记录? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 当您在 Linux 终端中使用向上键时 可以再次使用之前的命令 很棒的功能 但是 我开始使用命令中的敏感详细信息将 mysql 记录到 mysql 中
  • 使用 Admin SDK 将文件上传到 Firebase 存储

    根据Docs https cloud google com storage docs uploading objects storage upload object nodejs 我必须将文件名传递给函数才能上传文件 Uploads a l
  • 在达到 API 配额限制之前 YouTube 视频上传被拒绝

    我的项目的API配额通过申请过程成功增加到4M 通过以下方式在配额详细信息中确认了这一点 谷歌开发者控制台 https console developers google com已启用 API 的配额页面 然而 在标准的 50 次上传后 视
  • 使用 NDB 中的 Key 检索实体

    我有这样的结构 有章节的书籍 祖先 书 有页面 祖先 章节 我很清楚 要通过 ID 搜索章节 我需要通过祖先查询来搜索书籍 今天我了解到 如果我拥有所有密钥 我可以直接检索实体 而无需先获取书籍 然后获取章节 然后获取页面 如下所示 pag