Python GAE模型:如何在父节点中列出子节点
在Python和引用中使用GoogleAppEngine,您会自动从被引用对象返回到您正在处理的对象。答案中对此进行了很好的描述 我想做的是创建一个(更简单的)一对多关系,每个组都有一个标记列表,每个标记只属于一个组。我把它描绘成如下的样子:Python GAE模型:如何在父节点中列出子节点,python,database,google-app-engine,Python,Database,Google App Engine,在Python和引用中使用GoogleAppEngine,您会自动从被引用对象返回到您正在处理的对象。答案中对此进行了很好的描述 我想做的是创建一个(更简单的)一对多关系,每个组都有一个标记列表,每个标记只属于一个组。我把它描绘成如下的样子: class Group(db.Model): # All of my group-specific data here. class Tag(db.Model): text = db.StringProperty(required=Tru
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')
假设我对一切都理解正确。。。在上面的示例中,每个组
都有一个标记
属性:
# Get the list of Tag objects that belong to a Group object
mytags = mygroup.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)
我的想法是,当我查看组模型时,希望能够看到它有一个标记对象列表作为属性。我觉得必须查看标记模型才能了解这些信息是不自然的
注意:可能值得注意的是,我计划将所讨论的组
作为其标记
的父对象(对于实体组)。任何时候我修改一个组
,我都会完全更新它,用新的标签替换它的所有标签
,我想得到我正在查看的组给定“版本”的正确标签列表
我的数据的用例包括:
- 更新组-创建或更新6个组。如果创建,则为组创建标记。如果更新,则完全替换组的标记(删除旧标记)-大约每5分钟进行一次
- 阅读最近的群组-获取最近修改的6-20个群组(尚未确定),无需加载它们的标签
- 读取单个组-获取单个组的信息,包括其标签(每个组将有10到20个标签)
您将如何查询您的标签,您是否只关心来自特定实体组的标签?如果是这种情况,由于要将标记
实体放入组
实体的实体组,因此引用属性
不提供实际值。您可以改为使用tag_entity.key().parent()
来获取组
实体的键,或者使用tag_entity.parent()
来获取组
实体本身。然后,您可以使用Group
上的ListProperty
来存储标记实体的键名称(我认为这将是实际的“标记”)
由于在更新组
实体的任何时候都要替换组的所有标记,您是否考虑过使用列表属性
将标记直接存储在组
实体上。或者,直接在组
上存储标签键名称列表。这两种方法都可以使获取组的所有标记变得非常简单和高效。
一对多的使用家长在这将派上用场为您
<>你也可以考虑其他例子,如你所建议的,有一个列表属性,你可能会意识到,这意味着你要保留两个引用冗余,这是不必要的。更简单的方法是在描述关系的注释中进行注释
但是,如果仍要使用实体组,则不需要ReferenceProperty
或ListProperty
。您可以使用Tag.all()祖先(my_Group)
获取组的子项
另一种选择是将标记存储为字符串列表。附加信息可以存储在Tag
实体中,并将key\u name
s设置为Tag name。然后,您可以使用tag.get\u by\u key\u name(my\u entity.tags)
获取对象引用的所有标记实体。如果您通常只需要标记名,并且有时只检索完整数据,那么这非常有用,否则您最好使用ReferenceProperty
或实体组。我在我的问题中添加了更多的细节,包括用例和标记不仅仅包含文本信息这一事实。我已考虑将标记ID的ListProperty存储在组中。然后(iiuc)的问题是,在检索组的标记时,我需要使用“IN(ids)”子句,这会导致多个数据库命中。如果信息与标记一起存储,那么我可以使用“WHERE group\u id=:group\u id”类型的查询。@RHSeeger实际上,如果您存储实体id或名称的列表,那么您可以使用Model.get\u by\u key\u name()直接高效地获取它们。对于标记,我喜欢使用(大小写规范化的)标记作为标记实体key_名称,因为它提供了有用的数据,而无需获取标记实体。您还可以通过这种方式高效地删除(即不获取/查询)现有标记,因为您可以使用db.Key.from_path轻松地构建标记实体键。@Robert:您知道按_Key_name获取_的实际实现是什么吗?从我所读到的关于类似功能的内容来看,似乎每个键都会命中数据库一次。。。很像执行“键入(键列表)”sql查询。@RHSeeger,不,它与“键入”查询不同。密钥名称转换为密钥,然后执行单个批处理。SDK是开源的,我鼓励你去探索它,因为评论非常有用@罗伯特-非常感谢你提供的信息。奇怪的是,我遇到了一个问题,父对象中缺少父对象->子对象关系似乎导致了问题()。将代码转换为在模型中使用父->子关系(而不是子关系)。实体的父属性用于实体分组,以将数据存储在一起并允许事务。Usi