Как избежать дубликатов в хранилище данных GAE? - PullRequest
3 голосов
/ 16 октября 2011

Допустим, вот структура базы данных:

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.user и rating.news?Если такой рейтинг уже существует, его следует обновить, добавив новое значение.

1 Ответ

6 голосов
/ 17 октября 2011

Используйте ключевые имена и (возможно) родительские объекты для отслеживания. Например, предположим, что у вас есть 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, а не подсчитывать рейтинги по каждому запросу, что становится менее эффективным по мере увеличения количества рейтингов.

...