GAE数据存储的ReferenceProperty关系(GAE DataStore referenc

2019-07-28 20:48发布

我想从一个所有父/儿童一对多的关系。 传统上,我可以用一个加入做到这一点,但在数据存储这样的逃避我。

我已经发现了几个部分的例子要做到这一点,但没有一个是完整呢。

我有:

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)

Answer 1:

您的查询应正常工作,如果您删除围绕“斯科特”的报价,我想。

你也可以将所有斯科特的宠物实体有他作为他们的父实体:

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的。 使用这些或导入一个你喜欢的一个。



Answer 2:

看看由谷歌提出的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')


Answer 3:

你应该拥有的密钥筛选:

#not str "scott", use scott object.
pets = Pet.all().filter('owner =', scott).fetch(100)


文章来源: GAE DataStore referenceProperty relationship