在App Engine数据存储区中包含(不引用)一个模型到另一个模型中?

时间:2012-02-21 21:10:00

标签: python google-app-engine

堆叠的人,你好。

我觉得必须有一个明显的答案,但我已经做了很多搜索并阅读了很多文档和代码而且无法达到它。

(我将隐瞒一些实际名称,以及出于以下保密原因......)

这是我的第一个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”。

3 个答案:

答案 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上有点出血,但我正在开始一个新项目,所以我认为它会没事......