1

我试图让所有父母/孩子从一对多的关系中获得。传统上,我可以通过连接来做到这一点,但在数据存储中这样做让我无法理解。

我找到了几个部分示例来执行此操作,但还没有一个完整的示例。

我有:

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)
4

3 回答 3

4

我认为,如果您删除“scott”周围的引号,您的查询应该可以正常工作。

您还可以让 Scott 的所有 Pet 实体都将他的实体作为其父实体:

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语句打印的信息。正如尼克在评论中明智地指出的那样,您不应该print在 AppEngine 应用程序中使用。SDK 带有 Django 模板和 Jinja2。使用其中一种或导入您喜欢的一种。

于 2012-04-09T15:32:29.523 回答
0

查看google 制作的 GQL 示例

实例化所有者时,使用所有者名称作为唯一键,将“斯科特”赋予 key_name 而不是“名称”。

scott = Owner(key_name="scott")

以 scott 作为父级创建宠物

pet = Pet(key_name='rufus', parent=scott)

并查询他的宠物

SELECT * FROM Pets WHERE ANCESTOR IS KEY('Owner', 'scott')
于 2012-04-09T15:36:33.777 回答
0

您应该按所有者的密钥过滤:

#not str "scott", use scott object.
pets = Pet.all().filter('owner =', scott).fetch(100)
于 2012-04-10T03:32:25.963 回答