GAE — проблема с предком

Я хочу, чтобы в моем 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

Я всегда получаю ту же ошибку

BadRequestError:

Внутри транзакций разрешены только запросы предков.

Моя модель БД «Учетная запись» не имеет предков. Разве он не должен быть единственным «предком»?


person Maik Klein    schedule 08.07.2012    source источник
comment
вы делаете запрос внутри транзакции. в вашем запросе нет ancestor. ошибка вроде постоянная   -  person Giovanni Di Noia    schedule 09.07.2012
comment
Значит, мне не разрешено делать запрос внутри транзакции? Тогда я думаю, что единственный способ, который я знаю, - это поместить что-то в memcache (я думаю, что memcache тоже должен быть атомарным)   -  person Maik Klein    schedule 09.07.2012
comment
У меня недостаточно знаний, чтобы адекватно ответить на ваш вопрос, но у меня та же проблема с моими вычисляемыми свойствами: это делает запрос и возвращает простую сумму. Пришлось удалить все транзакции и поставить напрямую для продолжения разработки. В вашем случае попробуйте без декоратора. У нас будут лучшие ответы   -  person Giovanni Di Noia    schedule 09.07.2012


Ответы (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
person Chris    schedule 17.07.2012
comment
Спасибо. Но не могли бы вы объяснить мне, что такое ключ? В чем разница между ключом и запросом? я читал, хотя developers.google.com/appengine/docs/python/ndb/entities но я все еще в замешательстве - person Maik Klein; 19.07.2012
comment
См. developers.google.com/appengine/docs/python/ndb/keyclass, это ключ базы данных сущности. - person Chris; 01.01.2013