如何避免GAE数据存储中的重复?

时间:2011-10-16 16:08:23

标签: google-app-engine google-cloud-datastore

我们这里说的是数据库结构:

class News(db.Model):
    title = db.StringProperty()

class NewsRating(db.Model):
    user = db.IntegerProperty()
    rating = db.IntegerProperty()
    news = db.ReferenceProperty(News)

每个用户只能为每个新闻留下一个评级。以下代码不关心重复:

rating = NewsRating()
rating.user = 123456
rating.rating = 1
rating.news = News.get_by_key_name('news-unique-key')
rating.put()

我应该如何修改它允许每个rating.userrating.news组合只有一条记录?如果此类评级已存在,则应使用新值进行更新。

1 个答案:

答案 0 :(得分:6)

使用键名和(可能)父实体来跟踪。例如,假设您有UserInfo种类,您可以这样做:

class NewsRating(db.Model):
  # No explicit user reference, since it's the parent entity
  rating = db.IntegerProperty(required=True)
  news = db.ReferenceProperty(News) # We could get this from the key name, but this is more convenient

rating = NewsRating(parent=current_user, key_name=str(news.key().id()), news=news)
rating.put()

尝试多次添加相同的评级只会覆盖现有的评级,或者您可以使用数据存储区事务以原子方式添加它。

请注意,您几乎肯定会保留对News实体的总评分,而不是计算每个请求的评分,这会随着评分数量的增加而降低效率。