2

gaeに一意の値を設定したいので、ドキュメントを読んで、「トランザクション」がアトミックであることがわかりました。

https://developers.google.com/appengine/docs/python/ndb/transactions

class Account(ndb.Model):
    """"Required DB """
    username = ndb.StringProperty(required=True)
    password = ndb.StringProperty(required=True)
    mail = ndb.StringProperty(required=True)
    salt = ndb.StringProperty(required=True)
    date = ndb.DateTimeProperty(auto_now_add=True)

    name  = ndb.StringProperty()
    last_name  = ndb.StringProperty()
    phone_number  = ndb.IntegerProperty()
    postal  = ndb.IntegerProperty()
    city  = ndb.StringProperty()

    products = ndb.IntegerProperty(repeated=True)

    @ndb.transactional
    def create_account(self):
         acc = Account.query(Account.username==self.username)
         acc = tuple(acc)
         if len(acc)== 0:
             self.put()
         else:
             #yield error
             pass

私はawallysが同じエラーを取得します

BadRequestError:

トランザクション内では、祖先クエリのみが許可されます。

私のデータベースモデル「アカウント」には祖先がありません。それが唯一の「祖先」ではないでしょうか?

4

1 に答える 1

1

この問題を回避する方法は、ユーザー名をキーとして使用することです。

@classmethod
@ndb.transactional
def create(cls, username):
    key = ndb.Key('Account', username)
    existing_user = key.get()
    if existing_user:
        raise ValueError
    else:
        new_instance = cls(key=key, username=username)
        new_instance.put()
    return new_instance
于 2012-07-17T12:37:02.543 に答える