Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python GAE模型:如何在父节点中列出子节点_Python_Database_Google App Engine - Fatal编程技术网

Python GAE模型:如何在父节点中列出子节点

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

在Python和引用中使用GoogleAppEngine,您会自动从被引用对象返回到您正在处理的对象。答案中对此进行了很好的描述

我想做的是创建一个(更简单的)一对多关系,每个组都有一个标记列表,每个标记只属于一个组。我把它描绘成如下的样子:

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