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

时间:2011-06-03 20:07:20

标签: python database google-app-engine

在Python和引用中使用Google App Engine,您可以自动从引用的对象获取对您正在处理的对象的引用。在here找到的答案中对此进行了很好的描述。

我想要做的是创建一个(更简单的)一对多关系,每个组都有一个标签列表,每个标签只属于一个组。我想象它如下:

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对象列表作为属性。感觉不自然让我必须查看Tag模型才能知道这些信息。

注意: 可能值得注意的是,我计划将Group作为父级(针对实体组)每个都是Tag个。每当我修改Group时,我都会完全更新它,用新的Tag取代所有Group,并且我希望得到它们的给定“版本”的正确列表{{1}}我在看。

我的数据的用例包括:

  • 更新群组 - 创建或更新6个群组。如果是,则为该组创建标记。如果更新,则完全替换组的标签(删除旧标签) - 每5分钟左右发生一次
  • 阅读最近的群组 - 获取6-20(尚未确定)最近修改过的群组,无需加载他们的代码
  • 阅读单组 - 获取单个组的信息,包括其标签(每个标签包含10到20个标签)

3 个答案:

答案 0 :(得分:1)

您将如何查询您的标签,您是否只关注来自特定实体组的标签?如果是这种情况,由于您要将Tag实体放在Group实体的实体组中,ReferenceProperty没有提供任何实际价值。您可以使用tag_entity.key().parent()获取Group实体的密钥,或使用tag_entity.parent()获取Group实体本身。然后,您可以在ListProperty上使用Group来存储标记实体的key_names(我认为它们将是实际的'标记')。

由于您在更新Group实体时更换了所有群组的代码,您是否考虑过使用ListProperty将代码直接存储在Group实体上。或者,直接在Group上存储标记key_names列表。这两种方法都可以使组中的所有标签都非常简单有效。

答案 1 :(得分:1)

如您所知,拥有ListProperty将意味着您将冗余地保留两个引用,这是不必要的。一种更简单的方法是在描述关系的评论中简单地注明。

但是,如果您打算使用实体组,则不需要ReferencePropertyListProperty。您可以使用Tag来抓取Group的{​​{1}}个孩子。

另一种选择是将标签存储为字符串列表。其他信息可以存储在Tag.all().ancestor(my_group)个实体中,Tag设置为标记名称。然后,您可以使用key_name获取对象引用的所有标记实体。如果您通常只需要标记名称并且有时只检索完整数据,这将非常有用 - 否则您可能会坚持使用Tag.get_by_key_name(my_entity.tags)或实体组。

答案 2 :(得分:0)

modeling in appengine

使用父母的一对多将为你派上用场

你也可以考虑其他例子