我想从一个所有父/儿童一对多的关系。 传统上,我可以用一个加入做到这一点,但在数据存储这样的逃避我。
我已经发现了几个部分的例子要做到这一点,但没有一个是完整呢。
我有:
class Owner(db.Model):
name = db.StringProperty()
class Pet(db.Model):
petname = db.StringProperty()
owner = db.ReferenceProperty(Owner, collection_name='pets')
#now I want to print all pets owned by scott
scott = Owner(name="scott")
scott.put()
Pet(owner=scott,petname="rufus").put()
pets = Pet.all().filter('owner =', "scott").fetch(100)
print Pet.all().filter('owner =', "scott").fetch(0)
您的查询应正常工作,如果您删除围绕“斯科特”的报价,我想。
你也可以将所有斯科特的宠物实体有他作为他们的父实体:
class Owner(db.Model):
name = db.StringProperty()
class Pet(db.Model):
petname = db.StringProperty()
scott = Owner(name="scott")
scott.put()
Pet(parent=scott, petname="rufus").put()
Pet(parent=scott, petname="fluffy").put()
Pet(parent=scott, petname="snoogums").put()
pets = Pet.all().ancestor(scott).fetch(100)
# Feed pets to your templating engine. So to speak.
通过使斯科特宠物实体的父母,他们都加入到同一个实体组, ancestor
查询为您提供了一个简单而stragihtforward的方式来获得所有的Pet
实体是给定的'所有者”的孩子。 你应该有一个祖先查询比非阶查询获得更好的性能。
这确实强加宠物实体只能属于一个实体组的限制,如果你想有一个Pet
参与多个数据的关系,你将不得不选择另一种方法。 如果它是一比一的关系,只存储一个参考其他相关实体。
为了使您的可打印表示Pet
实体,给它一个__unicode__
方法,是这样的:
class Pet(db.Model):
petname = db.StringProperty()
def __unicode__(self):
return "I am " + self.petname
__unicode__
应该返回一个字符串,你希望看到的打印信息print
语句。 尼克明智地评论所指出的,你不应该使用print
在AppEngine应用程式。 该SDK附带了Django模板和Jinja2的。 使用这些或导入一个你喜欢的一个。
看看由谷歌提出的GQL例子 。
使用所有者名称作为唯一的密钥捐赠“SCOTT” instanciating所有者时KEY_NAME而不是“名”。
scott = Owner(key_name="scott")
与斯科特父创建宠物
pet = Pet(key_name='rufus', parent=scott)
和查询他的宠物
SELECT * FROM Pets WHERE ANCESTOR IS KEY('Owner', 'scott')
你应该拥有的密钥筛选:
#not str "scott", use scott object.
pets = Pet.all().filter('owner =', scott).fetch(100)