使用端点原型数据存储时设置父键但不设置子键

2024-04-09

如何为 EndpointsModel 设置父级/祖先并让数据存储区自动生成实体 ID/密钥?

我已经尝试去适应带有祖先的键 http://endpoints-proto-datastore.appspot.com/examples/keys_with_ancestors.html示例,但似乎有点困难,因为它需要指定 id 和parent。我想做类似的事情,除了仅提供父 ID 或密钥,并让应用程序引擎数据存储区自动生成实体 ID/密钥。

下面展示了我如何仅使用 NDB 来做到这一点。

class Parent(ndb.Model):
    name = ndb.StringProperty()

class MyModel(ndb.Model):
    attr1 = ndb.StringProperty()
    attr2 = ndb.StringProperty()

p = Parent(name="Jerry")
p_key = p.put()  # or retrieve the key from somewhere else

mod = MyModel(parent=p_key)
mod.put()

这可能吗?有人可以指出我正确的方向吗?谢谢。


带有祖先的键 http://endpoints-proto-datastore.appspot.com/examples/keys_with_ancestors.html示例,假设我们有相同的导入并定义了类MyParent以同样的方式在那里定义。

TL;DR 的答案本质上是通过parent=模型构造函数相当于创建一个键None作为种类 ID 对列表中的最后一个 ID。例如,对于一个类MyModel:

>>> parent = ndb.Key(MyModel, 1)
>>> child = MyModel(parent=parent)
>>> print child.key
ndb.Key('MyModel', 1, 'MyModel', None)

为了对示例执行此操作,我们可以简单地忽略id:

class MyModel(EndpointsModel):
  _parent = None

  attr1 = ndb.StringProperty()
  attr2 = ndb.StringProperty()
  created = ndb.DateTimeProperty(auto_now_add=True)

并且在设置器中只需设置半生的密钥,不要尝试从数据存储中检索(因为密钥不完整):

  def ParentSet(self, value):
    if not isinstance(value, basestring):
      raise TypeError('Parent name must be a string.')

    self._parent = value
    if ndb.Key(MyParent, value).get() is None:
      raise endpoints.NotFoundException('Parent %s does not exist.' % value)
    self.key = ndb.Key(MyParent, self._parent, MyModel, None)

    self._endpoints_query_info.ancestor = ndb.Key(MyParent, value)

类似地,在 getter 中,您可以直接从键检索父级(尽管这并不能保证只有一对作为父级):

  @EndpointsAliasProperty(setter=ParentSet, required=True)
  def parent(self):
    if self._parent is None and self.key is not None:
      self._parent = self.key.parent().string_id()
    return self._parent

完成此操作后,您无需更改任何 API 代码,该示例将按预期工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用端点原型数据存储时设置父键但不设置子键 的相关文章

随机推荐

  • 从 Hudson 获取 Eclipse PDT 每晚构建

    我一直在寻找 PDT 的最新夜间版本 但是官方下载网站 http www eclipse org epp download php仅截至 2010 年 9 月为止 经过一番搜索后 我被引导到他们CVS 仪表板 https hudson ec
  • 使用 Boost.Asio 时确保有效对象寿命的最佳方法是什么?

    最近经常使用 Boost Asio 我非常喜欢这个库 因为它提供了一种从当今的多核系统中榨取性能的绝佳方法 我曾多次问过自己这个问题 我认为在使用 Asio 进行异步调用时值得抛出关于对象生命周期 所有权的问题 我反复遇到的问题是 您经常必
  • 尝试以非 root 用户身份从容器内部写入已安装卷时出现问题

    我正在使用一个将运行 ZooKeeper 的容器 但我在安装到容器中的主机卷上遇到了权限问题 这是我的设置 在主机上 Ubuntu 14 04 创建了 zookeeper 系统用户 id 106 和组 id 111 创建目录 var log
  • 如何创建 NULL/空 DACL?

    我需要向每个人授予我正在创建的命名管道的访问权限 我理解的方法是创建一个 NULL 空 DACL 并将其传递给CreateNamedPipe 如何创建 NULL DACL 有人告诉我 这与传递 NULL 指针不同LPSECURITY ATT
  • 使用托管身份将 Function App 连接到 CosmosDB

    我正在尝试在函数应用程序中编写一个函数来操作 CosmosDB 中的数据 如果我将读写键放入环境变量中 我就能正常工作 为了使其更加强大 我希望它能够作为托管身份应用程序运行 该应用程序在 Cosmos DB 上具有 DocumentDB
  • 如何使用java删除文本文件中的特定字符串?

    我的输入文件有很多记录 作为示例 我们假设它有 这里的行号仅供参考 1 end 2 endline 3 endofstory 我期望我的输出为 1 2 endline 3 endofstory 但是当我使用这段代码时 import java
  • 将 Azure Functions 升级到 5.0:System.UriFormatException

    我一直致力于将我们的 Azure Functions 实现之一升级到 net 5 我已经与许多恶魔作斗争了 但正当我以为我已经整理了所有配置和依赖项注入更改时 它向我抛出了一个曲线球 后host RunAsync in Main 我得到以下
  • GWT CellTable 以编程方式选择 CheckBoxCell

    我有一个带有 CheckBoxCell 列的 cellTable 我想做的是在单元格表之外有一组按钮 让用户自动检查 取消检查一组不同的元素 例如检查所有 取消检查所有 但我想要更复杂的规则 我不明白的是如何访问该元素 我想通过行 列值 并
  • 为什么我没有从 Google OAuth 请求收到 RefreshToken?

    我正在尝试将 Google 日历集成到我的应用程序中 但在传递 RefreshToken 的 OAuth 授权方面遇到一些问题 我收到的 AccessToken 没有问题 但 RefreshToken 属性为 null 请参阅标记为 ERR
  • 用于处理 win32 FILETIME 的 Java 库?

    是否有任何 Java 库可以处理 win32文件时间 http msdn microsoft com en us library ms724284 28v vs 85 29 aspx时间间隔 它基本上是自 1601 年 1 月 1 日以来以
  • 3 个流体 Div 宽度 2 个固定边距?

    我有以下设置 但是将 div 的宽度设置为 30 左右并不能始终如一地工作 一旦窗口宽度小于某个数字 第三个 div 就会低于某个数字 有没有更好的方法来做到这一点 以便我的 div 始终保持内联并不断变得越来越小 同时它们之间的边距保持固
  • 用于 C++ 的 FastCGI

    我只找到了两个用于 C 的 FastCGI 库 有的是 官方 一 http www fastcgi com drupal node 6 q node 21 and 快速cgi https savannah nongnu org projec
  • 用户可编辑带有友好 ID 的 slugs

    Case 我的站点表单包含一个 slug 字段 如果输入了值 则应将其用作 slug 编辑 一些澄清 我想要的很像 slugs 在 WordPress 中的工作方式 如果未提供 slug gt slug 名称 如果提供了 slug gt 使
  • 如何有效检测逻辑和物理处理器的数量?

    目前我正在使用这个功能 它工作正常 但每个查询大约需要 1 秒 所以就我而言 我在应用程序中浪费了 3 秒钟 目前我正在考虑使用 3 个线程在一秒钟内获取所有信息 function GetWMIstring wmiHost wmiClass
  • Smalltalk:原语是如何实现的?

    我知道一切都是对象 您可以向 Smalltalk 中的对象发送消息来执行几乎所有操作 现在我们如何实现一个对象 内存表示和基本操作 来表示原始数据类型 例如如何 对于整数的实现 我查看了 Smalltalk 的源代码并发现了这个Smalli
  • Request.IsAuthenticated 始终为 true。我错过了什么?

    我正在尝试将用户名添加到 cookie 并在注销时清除它 但是Request IsAuthenticated返回始终为 true 因此我无法知道它是否是下一页上的成员 这是我正在尝试的 public void Logout FormsAut
  • 如何修复“向客户端发送响应时失败(22:无效参数)”

    使用 directio 时 如果有多个扇区大小不同的挂载点 Nginx 无法读取文件 我们的服务器在 Nginx 的根文件夹下安装了不同的硬盘 我们所有的旧磁盘的扇区大小都是 512 当我们更换磁盘时 Nginx 突然无法从该磁盘读取文件
  • 在 Android 设备中使用 ACTION_PICK 意图仅显示电话号码联系人

    我的目标是仅向用户显示带有电话号码的联系人 并让用户选择我想在本地存储的几个联系人 我在下面的方法中使用了各种选项来代替 ContactsContract Contacts CONTENT URI 但我收到了很多显示的联系人 许多都是垃圾邮
  • 查找 Java 类文件版本之间的差异

    我正在使用来自商业供应商的大型 Java Web 应用程序 我从供应商那里收到了一个新的 class 文件形式的补丁 该文件应该可以解决我们在软件方面遇到的问题 过去 应用该供应商的补丁会导致出现新的且完全不相关的问题 因此我想在将其应用于
  • 使用端点原型数据存储时设置父键但不设置子键

    如何为 EndpointsModel 设置父级 祖先并让数据存储区自动生成实体 ID 密钥 我已经尝试去适应带有祖先的键 http endpoints proto datastore appspot com examples keys wi