在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}}我在看。
我的数据的用例包括:
答案 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将意味着您将冗余地保留两个引用,这是不必要的。一种更简单的方法是在描述关系的评论中简单地注明。
但是,如果您打算使用实体组,则不需要ReferenceProperty
或ListProperty
。您可以使用Tag
来抓取Group
的{{1}}个孩子。
另一种选择是将标签存储为字符串列表。其他信息可以存储在Tag.all().ancestor(my_group)
个实体中,Tag
设置为标记名称。然后,您可以使用key_name
获取对象引用的所有标记实体。如果您通常只需要标记名称并且有时只检索完整数据,这将非常有用 - 否则您可能会坚持使用Tag.get_by_key_name(my_entity.tags)
或实体组。
答案 2 :(得分:0)