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

3
假设这里是数据库结构:
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个回答

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()

尝试多次添加相同的评分将简单地覆盖现有的评分,或者您可以使用数据存储事务以原子方式添加它。

请注意,您几乎肯定应保留针对新闻实体的总评级,而不是在每个请求中计算评级,因为随着评级数量的增加,这种方法会变得不太有效率。


Nick,一个key_name相同但父级不同的记录是否可能存在两个? - LA_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接