堆叠的人,你好。
我觉得必须有一个明显的答案,但我已经做了很多搜索并阅读了很多文档和代码而且无法达到它。
(我将隐瞒一些实际名称,以及出于以下保密原因......)
这是我的第一个AppEngine项目,虽然我写了很多Python。
我正在编写一个简单的应用程序,从概念上讲,它只有一个“数据库表”,一个模型 - 称之为Person,它代表了这个,呃,狗主人俱乐部中的一个人。
人有很多部分,其中一些部分具有自己的内部结构,如“DogsOwned”和“PlayDates”。我想要的是这些部分的单独定义,我将它们组合在一起制作一个完整的模型,所以我有一个DogsOwned.py和一个PlayDates.py,在我的主文件Person.py中引用。
我重申我不想要单独的DogsOwned或PlayDates“数据库表”!我仅对DogsOwned或PlayDates感兴趣,作为Person的一部分。
不幸的是,google.appengine.ext.db.Model
似乎没有办法包含其他模型。您可以使用google.appengine.ext.db.ReferenceProperty
,但似乎引用另一个按键的对象,要求我“创建另一个数据库表”(我知道我的术语不太正确,但您明白了)
因此,为了检索整个Person记录,在我看来,必须有多个查询,一个用于获取Person,一个用于DogsOwned或PlayDates中的每个条目。他们都将共享相同的实体组,因此它们应该是连贯的,并且它们都应该扩展 - 但是“我”会在某种意义上由Google“通过查询”向它收取费用,因为它归结为它,所以我'我喜欢尽量减少查询次数。或者......也许实体组以某种方式神奇地解决了我的问题?
请求您的启发性评论!提前谢谢。
更新:
换句话说:我希望模型包含重复的子元素 - 伪代码,
struct Person {
Dog dogsOwned[];
PlayDates playDates[];
};
其中Dogs和PlayDates不是原始属性。
Python继承对此没用 - 你不能多次继承同一个类,更重要的是,我想要“包含”,而不是“isa”。
答案 0 :(得分:1)
您可以将Person作为其他两种类型(IIRC)的父实体,从而将所有实体保留在同一实体组中。如果狗和游戏日期可以安全地序列化,你可以使用StringListProperty来获取它们的JSON版本,并将所有内容保存在Person实体中。
如果要保持较低的数据存储操作,可以使用memcache来防止对流行实体的重复读取。
答案 1 :(得分:0)
我真的不了解你的结构,但是你用Person模型子类化的其他简单类呢?
像:
class DogsOwned(object):
# variables, functions and whatever else you want
class PlayDates(object):
# same as above
class Person(db.Model, DogsOwned, PlayDates):
# the rest of your code.
再次不清楚你的目标是什么......
答案 2 :(得分:0)
天哪,我讨厌回答我自己的问题,但我挖掘了源代码并找到了它!
答案是google.appengine.ext.ndb.model.StructuredProperty
。
来自代码:
StructuredProperty与大多数其他属性不同;它 允许您为实体定义子结构。子结构 本身是使用模型类定义的,属性值是 该模型类的实例。但是它没有存储在 数据存储区作为单独的实体;相反,它的属性值是 包含在父实体中使用命名约定(名称为 结构化属性后跟一个点后跟名称 子属性)。
除了代码本身(很多)之外,文档很少,但是GvR谈论它here。
这正是我想要的。它适用于Python 2.7,它在App Engine上有点出血,但我正在开始一个新项目,所以我认为它会没事......