gae ndb 查询未能找到具有键 属性 的相关记录

gae ndb query failing to find related records with key property

我正在尝试实现一个代码,如果某个实体有任何相关实体,则不会删除该实体。

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()

运行时,儿子总是一个空列表[],尽管父亲有相关儿子。

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

正如@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) 的结果是 true/false (1/0) 值。

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

感谢您的帮助和发帖。

我通过使用这种技术(也称为变通方法)让它工作:

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()

我还是不明白为什么,但这对我有用。