GAE:ListPropertyでエンティティを取得するときのKindError

私は、ListPropertyを使って候補エンティティのキ​​ーを格納するContestエンティティを持っています。ここにいくつかの詳細があります:

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'

最後のクエリが機能しない理由を理解できますか?私は、クエリを実行しているモジュールに候補クラスをインポートしました。

更新:違いが生じる可能性がある場合、彼はdevサーバ上にあることに注意してください。

UPDATE2:

Nickの示唆したように、これは動作します:

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

これは動作しません(KindErrorを発生させます)。

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

UPDATE3:

違反行はテストコードで発生するため、本番サーバーでこの特定のエラーを試すことはできません。私はまったく同じ行を別の場所で使っていますが、これは開発サーバーと運用サーバーの両方で動作します。

Nickはインポートについて尋ねました。私はテストコードでこれをやっています:

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

それ以外はすべて典型的なものです。

ベストアンサー

ほとんどの場合、インポートしていない別のモジュールで候補を定義している可能性があります。
候補はどこに定義されていますか? db.get
を呼び出すと、そのモジュールをインポートしましたか?呼び出すときに有効な候補者を強制するので、
Candidate.get(key_list)を呼び出すと効果があります。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です