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

好的,似乎在离开 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 回答