如何在使用ReferenceProperty时查询数据存储?
我正在尝试理解数据存储中的一对多关系,但我不太明白当模型中包含 ReferenceProperty
时,如何查询和更新用户的记录。假设我有这样的模型:
class User(db.Model):
userEmail = db.StringProperty()
userScore = db.IntegerProperty(default=0)
class Comment(db.Model):
user = db.ReferenceProperty(User, collection_name="comments")
comment = db.StringProperty()
class Venue(db.Model):
user = db.ReferenceProperty(User, collection_name="venues")
venue = db.StringProperty()
如果我理解得没错,同一个用户,通过 userEmail
唯一标识,可以有很多评论,并且可能与很多场所(比如餐厅等)相关联。
现在,假设用户 az@example.com
已经在数据库中,并且他提交了一个新条目。
根据这个回答,我做了类似这样的操作:
q = User.all()
q.filter("userEmail =", az@example.com)
results = q.fetch(1)
newEntry = results[0]
但我不太清楚这具体做了什么!我想做的是更新 comment
和 venue
字段,这些字段在 class Comment
和 class Venue
中。
你能帮我理解这个是怎么回事吗?谢谢。
2 个回答
1
要获取某个用户的所有评论,可以通过用户的标识符来筛选用户属性:
comments = Comment.all().filter("user =", user.key()).fetch(50)
所以你可以先通过电子邮件找到这个用户,然后再用他的标识符去查找评论或场所。
4
你发的代码片段在做这些事情(见注释):
q = User.all() # prepare User table for querying
q.filter("userEmail =", "az@example.com") # apply filter, email lookup
- this is a simple where clause
results = q.fetch(1) # execute the query, apply limit 1
the_user = results[0] # the results is a list of objects, grab the first one
执行完这段代码后,the_user
就会变成一个对象,这个对象对应的是邮箱为 "az@example.com"
的用户记录。因为你已经设置了引用属性,所以你可以通过 the_user.comments
和 the_user.venues
来访问这个用户的评论和场所。其中一些场所是可以修改的,比如这样:
some_venue = the_user.venues[0] # the first from the list
some_venue.venue = 'At DC. square'
db.put(some_venue) # the entry will be updated
我建议你通读一下 GAE 的文档,里面有很多很好的例子,你会觉得很有帮助: http://code.google.com/appengine/docs/python/overview.html
** 更新 **:要给用户添加新场所,只需创建一个新场所,并将查询到的用户对象作为这个场所的用户属性:
new_venue = Venue(venue='Jeferson memorial', user=the_user) # careful with the quoting
db.put(new_venue)