gae ndb查询无法查找具有键属性

时间:2015-07-02 03:38:51

标签: google-cloud-datastore app-engine-ndb

我试图实施一个代码,如果它有任何相关实体,就不会删除该实体。

class Father(ndb.Model):
    name = ndb.StringProperty(indexed=True)

class Son(ndb.Model):
    name = ndb.StringProperty(indexed=True)
    father = ndb.KeyProperty(Father)

这是我的代码:

father = Father.get_by_id(long(keynumber))
if father:
    father_key = father.key
    if father_key:
        sons = Son.query(Son.father==father_key).fetch()
        number_of_sons = len(sons)
        if number_of_sons == 0:
            father_key.delete()

当这个运行时,儿子总是一个空列表[]虽然父亲有相关的儿子。

为什么这个查询不起作用?

2 个答案:

答案 0 :(得分:0)

正如@Patrick Costello建议的那样,使用strongly-consistent查询是处理此问题的正确方法:

class Father(ndb.Model):
    name = ndb.StringProperty(indexed=True)

class Son(ndb.Model):
    name = ndb.StringProperty(indexed=True)

    @classmethod
    def create(cls, name, father):
        son = cls(name=name, parent=father)
        son.put()

我建议使用count()操作:

father = Father.get_by_id(long(keynumber))
if father:
    father_key = father.key
    if father_key:
        sons_exist = Son.query(ancestor=father_key).count(1)
        if sons_exist == 0:
            father_key.delete()

仅计算最多1,count(1)的结果为真/假(1/0)值。

不完全相同,但this question类似。

答案 1 :(得分:0)

感谢您的帮助和帖子。

我通过使用这种技术(又称解决方法)来实现它:

father = Father.get_by_id(long(keynumber))
if father:
    father_key = father.key
    if father_key:
        sons = Son.query(Son.father==ndb.Key('Father', str(keynumber))).fetch()
        number_of_sons = len(sons)
        if number_of_sons == 0:
            father_key.delete()

我仍然不明白为什么,但这对我有用。