API конечных точек — ошибка проверки protorpc

Я получаю странные ошибки от protorpc при использовании конечных точек. В этом коде:

class Application(EndpointsModel):

    _message_fields_schema = ('id', 'name')

    created = ndb.DateTimeProperty(auto_now_add=True)
    name = ndb.StringProperty()
    roles = ndb.IntegerProperty(repeated=True)
    updated = ndb.DateTimeProperty(auto_now=True)
    owner = ndb.KeyProperty(kind='User')

@API.api_class(resource_name="application")
class ApplicationApi(protorpc.remote.Service):

    @Application.method(http_method="GET",
                        request_fields=('id',),
                        name="get",
                        path="applications/{id}")
    def ApplicationGet(self, instance):
        if not instance.from_datastore:
            raise endpoints.NotFoundException("Application not found.")
        return instance

    @Application.query_method(http_method="GET",
                              query_fields=('limit', 'order', 'pageToken'),
                              name="list",
                              path="applications")
    def ApplicationList(self, query):
        return query

когда я вызываю application.get() ошибка выглядит следующим образом: (полная трассировка здесь):

TypeError: можно копировать только из сущностей точного типа Application. Получен экземпляр Application.

а для вызова application.list() ошибка выглядит следующим образом: (полная трассировка здесь):

ValidationError: ожидаемый тип <class '.Application'> для элементов поля, найдено <Application name: u'test'> (тип <class '.Application'>)

Что может быть причиной этого? Мои другие модели с почти таким же кодом (только с другими свойствами) работают нормально.


comment
Эти трассировки выглядят так, как будто вы используете экземпляр Application вместо объекта класса (типа) Application. Вы уверены, что не используете Application() где-то в своем коде?   -  person Josh J    schedule 24.02.2016
comment
Только что перепроверил, нигде не использую - весь соответствующий код в вопросе. Я расширяю класс ApplicationApi(BaseRemoteService), но там нет упоминания о приложении, и есть метод API POST (который работает...), но даже если я удалю все это, я все равно получаю те же ошибки только с кодом из OP.   -  person Sasxa    schedule 24.02.2016
comment
Это выстрел в темноте, но до создания подкласса EndpointsModel был ли Application подкласс ndb.Model? Попробуйте перебрать все объекты Application и снова выполнить put для них. Я думаю, что ключ, который вы передаете, извлекает сущность, но что-то в цепочке наследования делает поля __class__ несоответствующими.   -  person Josh J    schedule 24.02.2016
comment
Возможно, ты прав. Странно то, что класс Application не был подклассом ничего, кроме EndpointsModel, но когда я создал подкласс class JsonModel(EndpointsModel) (также сделал некоторые другие вещи в коде, поэтому не могу быть уверен, что именно происходит), он начал работать. Я вернулся к EndpointsModel, и он все еще работает (; Думаю, единственный способ справиться с такими проблемами - отключить все остальное и изолировать модули с проблемами...   -  person Sasxa    schedule 24.02.2016


Ответы (1)


Подкласс class JsonModel(EndpointsModel), чтобы он снова начал работать.

person J_H    schedule 01.01.2018