我想创建一个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])
答案 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
消息。