GAE DataStore referenceProperty关系

时间:2012-04-09 15:10:55

标签: python google-app-engine referenceproperty

我试图让所有父母/孩子从一对多的关系中获得。传统上,我可以通过连接执行此操作,但在数据存储区中这样做是为了逃避我。

我找到了几个部分示例,但尚未完成。

我有:

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)

3 个答案:

答案 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)