堆栈的人们,你们好。
我觉得一定有一个明显的答案,但是我做了很多搜索,阅读了很多文档和代码,但找不到答案。
(出于保密原因,我将在下面隐藏一些实际名称......)
这是我的第一个 AppEngine 项目,尽管我已经编写了很多 Python 代码。
我正在编写一个简单的应用程序,从概念上讲,它只有一个“数据库表”,一个模型 - 称之为“人”,它代表这个,呃,狗主人俱乐部中的一个人。
Person 有很多部分,其中一些具有自己的内部结构的重复部分,例如“DogsOwned”和“PlayDates”。我想要的是这些部分的单独定义,我将它们组合在一起形成一个完整的模型,因此我有一个 DogsOwned.py 和一个 PlayDates.py,它们在我的主文件 Person.py 中引用。
我重申,我不需要单独的 DogsOwned 或 PlayDates“数据库表”!我仅对作为 Person 的一部分包含的 DogsOwned 或 PlayDates 感兴趣。
遗憾的是,google.appengine.ext.db.Model
似乎无法包含另一个模型。您可以使用google.appengine.ext.db.ReferenceProperty
,但这似乎通过键引用另一个对象,要求我“创建另一个数据库表”(我知道我的术语不太正确,但你明白了)。
因此,为了检索整个 Person 记录,在我看来,必须有多个查询,一个查询用于获取 Person,另一个查询用于 DogsOwned 或 PlayDates 中的每个条目。它们都将共享相同的实体组,因此它们应该是连贯的,并且都应该是可扩展的 - 但“我”在某种意义上会被谷歌“通过查询”计费,所以当涉及到它时,我'我希望将查询数量保持在尽可能低的水平。或者...也许实体组以某种方式神奇地解决了我的问题?
征求您的启发性意见!提前致谢。
更新:
换句话说:我希望模型包含重复的子元素 - 用伪代码,
struct Person {
Dog dogsOwned[];
PlayDates playDates[];
};
其中 Dogs 和 PlayDates 不是原始属性。
Python 继承对此没有用 - 你不能多次继承同一个类,更根本的是,我想要“contains”,而不是“isa”。
最佳答案
通过将 Person 设为其他两种类型 (IIRC) 的父实体,您可以将所有实体保留在同一实体组中。如果可以安全地序列化狗和玩耍日期,您可以使用 StringListProperty 作为它们的 JSON 版本,并将所有内容保留在 Person 实体内。
如果您希望降低数据存储操作,可以使用 memcache 来防止重复读取常用实体。
关于python - 在 App Engine 数据存储区中包含(而不是引用)一个模型到另一个模型中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9385225/