如何在使用ReferenceProperty时查询数据存储?

2 投票
2 回答
1191 浏览
提问于 2025-04-16 07:42

我正在尝试理解数据存储中的一对多关系,但我不太明白当模型中包含 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]

但我不太清楚这具体做了什么!我想做的是更新 commentvenue 字段,这些字段在 class Commentclass 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.commentsthe_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)

撰写回答