私は、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)
を呼び出すと効果があります。