扩展EndpointsModel时不显示子类属性

时间:2014-01-28 19:26:05

标签: python google-app-engine google-cloud-endpoints endpoints-proto-datastore

我想创建一个BaseModel,它是一个EndpointsModel,包含我所有模型中常见的属性(即created_at,modified_at)。然后我想创建一个扩展BaseModel的用户模型。

但是,我遇到了一个问题,当我在API资源管理器中查看我的“user.create”方法时,请求主体仅显示created_at和modified_at的BaseModel属性,但不显示username属性。

这就是我所拥有的:

from endpoints_proto_datastore.ndb import EndpointsModel
from google.appengine.ext import ndb

class BaseModel(EndpointsModel):
  created_at = ndb.DateTimeProperty(auto_now_add=True)
  modified_at = ndb.DateTimeProperty(auto_now=True)

class User(BaseModel):
  username = ndb.StringProperty(required=True)

以下是使用Google Cloud Endpoints构建的API:

import endpoints
from google.appengine.ext import ndb
from models import User
from protorpc import remote

@endpoints.api(name='user', version='v1',
               description='API for User Management')
class UserApi(remote.Service):

  @User.method(name='user.create', path='user'):
  def create_user(self, user):
    user.put()
    return user

application = endpoints.api_server([UserApi])

1 个答案:

答案 0 :(得分:0)

如果您转到http://localhost:8080/_ah/api/discovery/v1/apis/user/v1/rest,您会看到API生成的发现文档。请注意(create资源上的user方法显示为BaseModel而不是User

现在我不知道为什么会发生这种情况 - 它肯定与EndpointsModel所做的魔术有关 - 但我已经能够通过切换继承来实现你想要的结果,并且像BaseModel一样对待一个mixin而不是一个基类,User模型可以直接从EndpointsModel继承:

class BaseModel:
    created_at = ndb.DateTimeProperty(auto_now_add=True)
    modified_at = ndb.DateTimeProperty(auto_now=True)

class User(BaseModel, EndpointsModel):
    username = ndb.StringProperty(required=True)

然后有必要将BaseModel重命名为更明确的东西,现在是混合。

如果您检查相同的发现文档(或API资源管理器),您会注意到create在此更改后收到User消息。