2

Rafe Kaplan在数据存储here中有一对很好的关系。我试图将其适用于更简单的UserVenue的情况。所以用户可以去许多餐馆;我要打印的用户电子邮件和餐馆的用户去:数据存储中的一对多关系

class User(db.Model): 
    userEmail = db.StringProperty() 

class Venue(db.Model): 
    user = db.ReferenceProperty(User, 
            collection_name="venues") 
    venue = db.StringProperty() 

class OneToMany(webapp.RequestHandler): 
    def get(self): 
     scott = User(userEmail="[email protected]") 
     scott.put() 
     Venue(user=scott, 
        venue="club1").put() 
     Venue(user=scott, 
        venue="club2").put() 

     for v in scott.venues: 
      self.response.out.write(v.venue) 

这将打印"club1 club2"

但我想"[email protected]"与他去的地方相关联;所以我想打印是这样的:"[email protected]: club1, club2"

试图

for v in scott.venues: 
    self.response.out.write(userEmail) 
    self.response.out.write(v.venue) 

给出了错误:

self.response.out.write(userEmail) 
NameError: global name 'userEmail' is not defined 

什么是这样做的正确方法是什么?谢谢!

EDIT2(RE:答案通过vonPetrushev)

这似乎工作:

query = User.all() 
    query.filter("userEmail =", "[email protected]") 
    results=query.fetch(1) 
    scott=results[0] 
    self.response.out.write("%s went to:" % scott.userEmail) 
    for venue in scott.venues: 
     self.response.out.write(venue.venue) 

显示:

[email protected] went to:club1club22

编辑(RE:答案通过vonPetrushev )

我有点困惑。

所以我想写这样

query = User.all() 
query.filter("userEmail =", "[email protected]") 

查询并显示与该用户相关联的所有场馆。

目前还不清楚UserVenue是如何连接的。

回答

1

userEmailfor循环的范围内不是定义的名称。你需要的是:

for v in scott.venues: 
    self.response.out.write(scott.userEmail) 
    self.response.out.write(v.venue) 

编辑:关于你的编辑 - 如果你的目标是要连接查询 - 你不能,不与谷歌应用程序数据存储。但是,你可以抓住用户是这样的:

query = User.all() 
query.filter("userEmail =", "[email protected]") 
results=query.fetch(1) 
scott=results[0] 

然后拿到场地像scott.venues。该关系在db.ReferenceProperty的行中定义,该行定义什么是someuser.venues以及什么是somevenue.user

+0

感谢这项工作和打印:`[email protected] club1 s[email protected] club22`我添加了一个`EDIT`,因为我不懂如何查询用户并获取所有场地。 – Zeynel 2010-11-27 18:51:16

相关问题