1
from google.appengine.ext import db

class Parent(db.Model):
    app_id = db.StringProperty()

class Child(db.Model):
    app_id = db.ReferenceProperty(Parent,collection_name='children')
    type = db.StringProperty()
    count = db.IntegerProperty()

@db.transactional
def increment_counter(app,childName):
    childA = Child.all().ancestor(app).filter('type =',childName).get()
    if  childA is not None:
        obj = db.get(childA.key())
        obj.count += 1
        obj.put()
    else:
        childA = Child(app_id=app.key(),type=childName,count=0)
        childA.put()

increment_counter(Parent.all().filter('app_id =',app_id).get().key(),childKey)

childA が空の場合、これは put() のタイトル エラーで失敗します。

私の頭の中で、トランザクションで使用している単一の親エンティティに新しい子エンティティをアタッチしたいと考えています。それがまだ存在しない場合は、インクリメントします。これが祖先クエリと見なされないのはなぜですか?また、目的の効果を得るために代わりに何をすべきですか?

4

1 に答える 1

1

OK、App Engine からしばらく離れた後、エンティティの親と ReferenceProperty の別個の概念を混同したようです。

正しいコード:

class Parent(db.Model):
    app_id = db.StringProperty()

class Child(db.Model):
    type = db.StringProperty()
    count = db.IntegerProperty()

@db.transactional
def increment_counter(app,childName):
    childA = Child.all().ancestor(app).filter('type =',childName).get()
    if  childA is not None:
        obj = db.get(childA.key())
        obj.count += 1
        obj.put()
    else:
        childA = Child(parent=app,type=childName,count=0)
        childA.put()

increment_counter(Parent.all().filter('app_id =',app_id).get().key(),childKey)
于 2012-07-21T17:54:02.300 に答える