谷歌应用引擎,数据存储对象的困境

时间:2014-07-15 17:21:53

标签: python python-2.7 google-app-engine for-loop google-cloud-datastore

所以我不确定原因,但我的程序似乎无法辨别r是否在结果中

我想知道这是否与Cloud Datastore对象有关

terms = query.split()
res = db.GqlQuery("SELECT * FROM Assignment ORDER BY created DESC")
results = []
for term in terms:
    term.strip()
    for r in res:
        #WHY THE CRAP DOESNT THIS WORK....
        #if r is in results... it still appends r to results
        if term in r.name and r not in results:
            results.append(r)
        if r.tags:
            if term in r.tags and r not in results:
                results.append(r)

1 个答案:

答案 0 :(得分:2)

该行

for r in res:

在循环内

for term in terms:

res是一个查询。所以当你打电话时

for r in res:

它真的在呼唤

for r in res.run():

因此代码执行查询并每次通过外部循环获取一组新的结果。因此,这些新的结果对象与您在外部循环的先前迭代中可能保存的结果对象不匹配。

你可以改变"结果= []"反而是字典,并使用实体的键作为字典中的键,然后比较检查将起作用。但是,在外部循环中多次执行此查询效率非常低。

您的代码的目标似乎是找出哪些Assignment实体在Assignment.name或Assignment.tags属性中包含搜索项。如果是这种情况,那么我建议交换周围的事情并做类似以下的事情:

terms = query.split()
assignments = db.GqlQuery("SELECT * FROM Assignment ORDER BY created DESC")
assignmentsWithTerms = []

for assignment in assignments:
    for term in terms:
        if term in assignment.name or (assignment.tags and term in assignment.tags):
            assignmentsWithTerms.append(assignment)
            continue

这种方法只会执行一次GqlQuery,因此它会更快,更便宜。此外,当您遍历结果时,它会在找到第一个术语后立即将分配添加到列表中,然后继续前进,再次使其更快。

我希望这有帮助!