我试图了解数据存储区中的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]
但我不清楚这是做什么的!我想要做的是更新comment
和venue
下的class Comment
和class Venue
字段。
你能帮我理解一下这是怎么回事吗?感谢。
答案 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.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)
答案 1 :(得分:1)
要获取给定用户的所有评论,请使用用户密钥过滤用户属性:
comments = Comment.all().filter("user =", user.key()).fetch(50)
因此,您可以先通过电子邮件查找用户,然后使用其密钥搜索评论或场所。