GAE: KindError при получении сущностей через ListProperty - PullRequest
1 голос
/ 13 ноября 2011

У меня есть объект 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:

В тестовом коде встречается оскорбительная строка, поэтому я не могу попробовать этот конкретный сбой на рабочем сервере. Я использовал точно такую ​​же строку в другом месте, и она работает как на dev, так и на производственных серверах.

Ник спросил об импорте, и я делаю это в своем тестовом коде:

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

но все остальное просто типично.

Ответы [ 2 ]

1 голос
/ 14 ноября 2011

Скорее всего, вы определяете Candidate в другом модуле, который вы не импортировали. Где определяется Candidate? Вы импортировали модуль, в котором он находится, когда вы звоните db.get? Вызов Candidate.get(key_list) должен работать, так как он заставляет вас иметь действительный Candidate при вызове.

0 голосов
/ 13 ноября 2011

Попробуйте это:

c = db.get([str(i) for i in contest.candidates])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...