2011-10-16 19 views
3

のは、ここで言ってみましょうデータベース構造である:GAEデータストアで重複を避けるにはどうすればよいですか?

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

キー名と(場合によっては)親エンティティを使用して追跡します。

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

が複数回は、単に既存の上書きされますと同じ評価を追加しようとすると、またはあなたはそれをアトミックに追加するには、データストアのトランザクションを使用することができます。たとえば、あなたがUserInfoようなものを持っていると仮定、あなたはこのようにそれを行うことができます。

Newsエンティティに対しては、各リクエストのレーティングを数えるのではなく、レーティングの数が増えるほど効率が低下することはほとんどありません。

+0

Nick、同じ 'key_name'を持つ2つのレコードを持つことは可能ですか? –

+0

@LA_はい、そうです。 –

関連する問題