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

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

1

2 答え

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

1
追加された
Nick、提案した行はうまくいきますが、候補モデルをインポートした後にdb.getを使用してもそれはありません。私の質問への更新を見てください。
追加された 著者 Jeff O'Neill,
私は今週末までにそれに行くことはできません。私はdevサーバーでこれを試しただけです。
追加された 著者 Jeff O'Neill,
Nick、上記のUPDATE3を参照してください。エラーはテストコード(testbedとwebtestを使用)で発生し、テストコードには説明できないことがあります。私は前にあなたが与えた回避策を使って進むつもりですが、私がもっと情報を提供したいかどうかを教えてください。
追加された 著者 Jeff O'Neill,
@ジェフそれはかなり現実的です。 google.appengine.ext.db._kind_map のコンテンツをログに記録できますか?これは、プロダクションとdevサーバの両方で発生しますか?珍しい方法でインポート(リロード、インポートパス)を邪魔していますか?
追加された 著者 Nick Johnson,

これを試して:

c = db.get([str(i) for i in contest.candidates])
1
追加された
私はすでにそれを試して、それは動作しません。実際には、これは動作しますが、c = models.Candidate.all()。ancestor(contest).fetch(2)、ちょうど取得したエンティティのキ​​ーを使用して再度取得しようとすることはできません。 't仕事:db.get(c [0] .key())。これがdevサーバのバグかどうか疑問に思っています。
追加された 著者 Jeff O'Neill,
なぜあなたはこれが助けになると思いますか?
追加された 著者 Nick Johnson,