我正在努力使所有父母/孩子之间建立一对多的关系。传统上,我可以使用联接执行此操作,但是在数据存储区中执行此操作会使我逃脱。

我已经找到了一些可以做到这一点的例子,但是还没有一个完整的例子。

我有:

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)

最佳答案

我认为,如果删除“ 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语句中显示的信息。正如Nick明智地在注释中指出的那样,您不应在AppEngine应用程序中使用print。该SDK随附Django模板和Jinja2。使用其中之一或导入您喜欢的一个。

09-25 20:33