GAE:通过ListProperty获取实体时的KindError

时间:2011-11-12 22:43:14

标签: python google-app-engine

我有一个Contest实体,它使用ListProperty存储候选实体的键。以下是一些细节:

class Contest(db.Model):
    candidates = db.ListProperty(db.Key)

    def create_candidate_objects(self):
        put_list = []
        for n, name in enumerate(self.tmp_candidates):
            put_list.append(Candidate(parent = self, name = name))
        keys = db.put(put_list)
        self.candidates = keys
        self.put()

class Candidate(db.Model):
    name = db.StringProperty(required = True)

当我执行此查询时:

c = models.Candidate.all().ancestor(contest).fetch(2)

一切正常。

但是当我使用ListProperty进行查询时:

c = db.get(contest.candidates)

我收到错误

KindError: No implementation for kind 'Candidate'

你能帮我理解为什么最后一个查询不起作用吗?我已将Candidate类导入到正在执行查询的模块中。

更新:请注意,他可能会在开发服务器上,以防可能产生影响。

UPDATE2:

根据尼克的建议,这有效:

c2 = models.Candidate.get(contest.candidates)

但这不起作用(引发KindError):

from models import Candidate
c = db.get(contest.candidates)

UPDATE3:

违规行发生在测试代码中,因此我无法在生产服务器上尝试此特定故障。我在其他地方使用了完全相同的行,它在开发和生产服务器上都有效。

尼克询问了进口问题,我在测试代码中这样做了:

sys.path.append("/usr/local/google_appengine/lib/simplejson")
import simplejson as json

但其他一切都很典型。

2 个答案:

答案 0 :(得分:1)

您很可能在另一个尚未导入的模块中定义CandidateCandidate在哪里定义?当您致电db.get时,您是否导入了模块?调用Candidate.get(key_list)应该有效,因为它会在您调用时强制您拥有有效的Candidate

答案 1 :(得分:-1)

试试这个:

c = db.get([str(i) for i in contest.candidates])