34092


DataStoreを使っているのですが、同じKind内のEntityにユニークな値を持たせたいと考えています。ただし対象のEntityには親のEntityがそれぞれあるものとします。

具体的に例をあげて説明させていただきます。  
例えばユーザとユーザの所持アイテムがあったとします。  
そして所持アイテムの親はユーザです。  
またこのアイテムは他のユーザに移譲できるものとします。

またそれぞれのアイテムは変化しないユニークな値を割りふりたいです。  
なぜならそのアイテムに紐付いているデータがあると想定されるためです。  
例えば移譲回数に限度があるや、アイテムの移動ログなどです。

私の認識ではアイテムの移譲を実現するためには、一度アイテムエンティティを消して、移譲先のユーザのエンティティにアイテムを作成することで実現できると考えています。

しかしこの方法だともしDataStoreにIDを自動で振らせていた場合、キーのIDが変更されてしまいます。  
しかしIDをこちらで指定してコピーすることはできません。  
なぜならエンティティグループが違うため、衝突する可能性があるためです。

RDBではAutoIncrementがテーブルごとにできるため、この様な問題は起こらないのですが、DataStoreではどの様にすればこの問題が解決できるかわかりません。

ご回答頂けると助かります。


CC BY-SA 3.0
2017-04-17T23:30:38.510
34079
2017-04-18T04:50:49.513
2017-04-18T00:01:34.603
15186
15186
question
google-app-engine
DataStoreで同じKind内のEntityに一意な値をつけたい


アイテムのユニークな所有権の実現には、普通ならRDBの外部キーを使用すべきです。GAEに外部キーを取り扱いには、[ReferenceProperty](https://cloud.google.com/appengine/docs/standard/python/datastore/typesandpropertyclasses#ReferenceProperty)を利用すべきです。

例えば

[code]

    class User(db.Model):
        name = db.StringProperty()
    
    class Item(db.Model):
        name = db.StringProperty()
    
        # 所有者
        owner = db.ReferenceProperty(User, collection_name='all_items')
    
        # 移譲回数
        transfer_count = db.IntegerProperty()
    
    user_a = db.Query(User).filter('name =', 'Akira').first()
    user_b = db.Query(User).filter('name =', 'Benimaru').first()
    
    # user_a のアイテムを取得
    item_of_user_a = user_a.all_items.get()
    if item_of_user_a is not None:
        # 所有権の変更には、ほかのユーザーオブジェクトとして設定すれば良い
        item_of_user_a.owner = user_b
        # 移譲回数を1増やす
        item_of_user_a.transfer_count += 1
        item_of_user_a.put()
    
[/code]


CC BY-SA 3.0
2017-04-18T04:50:49.513
34092
2017-04-18T04:50:49.513
18621
34079
answer