2011-08-07 19 views
0

私は自分のキーを持つデータストアにレコードを作成しようとしました:db.run_in_transactionレコードで作成したキーを取得する方法は?

class Counter(db.Model): 
    counter = db.IntegerProperty() 

def increase_counter(key): 
    obj = db.get(key) 
    if obj is None: 
     obj = Counter(key_name=key, counter=1) 
    else: 
     obj.counter += 1 
    obj.put() 

db.run_in_transaction(increase_counter, "z"+intValue1+"_"+intValue2+"_"+intValue3) 

それは動作しませんので、それはどのように私はのために作成されたキーを知ることができ、

BadKeyError: Invalid string key z523068_139840081_879156.

を返します。私の記録? db.run_in_transactiondb.Key()を使用できますか?最初にカウンタを作成し、自動的に生成されたキーで値を増やすにはどうすればよいですか?

Upd。は、私はまた、次の試してみた:

def increase_counter(key): 
    if key is None: 
     obj = Counter(counter=1) 
    else: 
     obj = db.get(key) 
     obj.counter += 1 
    obj.put() 
    return obj.key() 

db_counter_key = None # initially we don't have key value 
for argument in files_arguments: 
    db_counter_key = db.run_in_transaction(increase_counter, db_counter_key) 

答えて

3

は、あなたがたキー名を渡しているので、あなたはdb.getの代わりにget_by_key_nameを使用する必要があります。

class Counter(db.Model): 
    counter = db.IntegerProperty() 

def increase_counter(key_name): 
    obj = Counter.get_by_key_name(key_name) 
    if obj is None: 
     obj = Counter(key_name=key_name, counter=1) 
    else: 
     obj.counter += 1 
    return obj.put() 

db.run_in_transaction(increase_counter, "z"+intValue1+"_"+intValue2+"_"+intValue3) 

編集を。

def increase_counter(key, amount=1): 
    obj = db.get(key) if key else None 
    if obj: 
     obj.counter += amount 
    else: 
     obj = Counter(counter=amount) 

    return obj.put() 

db_counter_key = None # initially we don't have key value 
db_counter_key = db.run_in_transaction(increase_counter, db_counter_key, 
             amount=len(files_arguments)) 

(あなたの例以下、あなたが複数のトランザクションを実行する必要はありません、代わりに増分値としてamount引数を渡すことができます)

:あなたが本当に鍵を渡す必要がある場合は、これを使用することができます

put()がエンティティキーを返すので、obj.put()を返すことができます。

関連する問題