在Python和引用中使用Google App Engine时,会自动从引用对象获取对应于您所处理对象的反向引用。这在回答here中描述得非常好。GAE模型:如何在父级中列出子节点
我想要做的是创建一个(更简单)一对多的关系,每个组都有一个标签列表,每个标签只属于一个组。我想象它像下面这样:
class Group(db.Model):
# All of my group-specific data here.
class Tag(db.Model):
text = db.StringProperty(required=True)
group = db.ReferenceProperty(Group, collection='tags')
假设我正确理解的一切......在上面,你风与每个Group
有tags
属性:
# Get the list of Tag objects that belong to a Group object
mytags = mygroup.tags
我的问题是,是有没有一种“标准”方式将这些信息包含在Group
对象中?查看数据模型时,通过查看Group
对象,您无法看到它有一个适用于它的标签列表。我想能够定义Group,Tags
就像这样
class Group(db.Model):
# This should automatically be the same as the "tags" property that is
# created for the Group model by the definition of the Tag model
tags = db.ListProperty(db.Key)
# All of my group-specific data here.
class Tag(db.Model):
text = db.StringProperty(required=True)
group = db.ReferenceProperty(Group, collection='tags', required=True)
# Other tag specific information here (such as url, etc)
的想法是,我希望能够看到,当我在看的集团模式,它有标签的物体的列表属性。它感觉不自然我不得不看看标签模型知道这些信息。
注:这可能是值得指出的是,我计划有问题的Group
是每一个它的父(对实体集团)是Tag
秒。任何时候我修改一个Group
,我都会完全更新它,用新的替换它的所有Tag
,我想要得到他们对于我看到的Group
给定“版本”的正确列表。
的用例为我的数据包括:
- 更新组 - 创建或更新6组。如果创建,则为该组创建标签。如果更新,完全替换组的标签(删除旧标签) - 每隔5分钟左右发生一次
- 阅读最近的组 - 获取最近修改过的6-20组(未确定),无需加载标签
- 读单组 - 获取单个组的信息,包括它的标签(每个人都会有10到20个标签)
我在我的问题中添加了一些更多的细节,包括用例以及标签比文本更多的信息。我曾考虑将tag ID的ListProperty与组进行存储。然后问题(iiuc)是,当为一个组检索标签时,我需要使用“IN(ids)”子句,这会导致多个数据库命中。如果信息与标签一起存储,那么我可以使用“WHERE group_id =:group_id”类型的查询。 – RHSeeger 2011-06-03 21:13:22
@RHSeeger实际上,如果您存储实体ID或名称的列表,那么您可以非常有效地直接使用Model.get_by_key_name(http://code.google.com/appengine/docs/python/datastore/modelclass.html# Model_get_by_key_name)。对于我喜欢使用(case normalized)标记作为标记实体key_name的标记,因为它为您提供了有用的数据,而无需获取标记实体。您也可以通过这种方式高效地删除(即不提取/查询)现有标签,因为您可以使用db.Key.from_path轻松构建标签实体密钥。 – 2011-06-05 04:48:09
@Robert:你知道get_by_key_name的实际实现是什么吗?从我读过的类似功能看来,它似乎会为每个键敲击一次数据库......就像做一个“键列表”(键列表)sql查询。 – RHSeeger 2011-06-05 05:05:37