我试图让所有父母/孩子从一对多的关系中获得。传统上,我可以通过连接执行此操作,但在数据存储区中这样做是为了逃避我。
我找到了几个部分示例,但尚未完成。
我有:
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)
答案 0 :(得分:4)
如果你删除" scott"周围的引号,你的查询应该可以正常工作。
你也可以让所有斯科特的宠物实体都将他的实体作为他们的父母:
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.
通过将scott作为Pet实体的父级,它们都被添加到同一个实体组中,ancestor
查询为您提供了一种简单而直接的方法来获取所有Pet
个实体是给定的'所有者'的孩子。使用祖先查询比使用非祖先查询获得更好的性能。
这确实强加了Pet实体只能属于一个实体组的限制,如果您希望Pet
涉及多个数据关系,则必须选择另一种方法。如果它是一对一的关系,只需将参考存储到另一个相关实体。
要获得Pet
实体的可打印表示形式,请使用__unicode__
方法,如下所示:
class Pet(db.Model):
petname = db.StringProperty()
def __unicode__(self):
return "I am " + self.petname
__unicode__
应该返回一个字符串,其中包含您希望通过print
语句打印的信息。正如尼克明智地在评论中指出的那样,你不应该在AppEngine应用程序中使用print
。 SDK附带了Django模板和Jinja2。使用其中之一或导入您喜欢的。
答案 1 :(得分:0)
请看The GQL examples made by google。
使用所有者名称作为唯一键,在实例化所有者时将'scott'赋予key_name而不是'name'。
scott = Owner(key_name="scott")
用scott作为父
创建宠物pet = Pet(key_name='rufus', parent=scott)
用
查询他的宠物SELECT * FROM Pets WHERE ANCESTOR IS KEY('Owner', 'scott')
答案 2 :(得分:0)
您应按所有者密钥过滤:
#not str "scott", use scott object.
pets = Pet.all().filter('owner =', scott).fetch(100)