выполнение транзакций в db.Model - PullRequest
0 голосов
/ 03 апреля 2012

Я пытаюсь создать модель данных ядра приложения Google со следующими атрибутами:

  1. сохранить строку, пару значений в BigTable
  2. если строка, пара значений НЕ существует, создайте запись
  3. если строка, пара значений существует, обновите запись, увеличив счетчик

код:

class stringListRecord(db.Model):
    type  = db.StringProperty();
    value = db.StringProperty();
    refs  = db.IntegerProperty(default=1);

    def __init__(self, *args, **kw):
        key = db.GqlQuery("SELECT __key__ FROM stringListRecord WHERE type = :1 AND value = :2", kw['type'], kw['value']).get();
        if key != None:
            kw['key'] = key;
        db.Model.__init__(self, *args, **kw);

    def increment_counter(self, key):
        obj = db.get(key);
        obj.refs += 1;
        db.Model.put(obj);

    def put(self):
        if self.key() != None:
            self.increment_counter(self.key());
            #db.run_in_transaction(self.increment_counter, self.key());
        else:
            db.Model.put(self);

Когда я запускаю закомментированный код, то есть db.run_in_transaction (), я получаю:

Only ancestor queries are allowed inside transactions.

Есть ли лучший способ получить эту функциональность от GAE?

...