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

时间:2010-11-27 23:47:19

标签: python google-app-engine google-cloud-datastore one-to-many

我试图了解数据存储区中的1对多关系;但是当模型包含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已经在数据库中,他提交了一个新条目。

Based on this answer我做了类似的事情:

q = User.all()
q.filter("userEmail =", az@example.com)
results = q.fetch(1)
newEntry = results[0]

但我不清楚这是做什么的!我想要做的是更新commentvenue下的class Commentclass Venue字段。

你能帮我理解一下这是怎么回事吗?感谢。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

要获取给定用户的所有评论,请使用用户密钥过滤用户属性:

comments = Comment.all().filter("user =", user.key()).fetch(50)

因此,您可以先通过电子邮件查找用户,然后使用其密钥搜索评论或场所。