1

我想创建一个作为 EndpointsModel 的 BaseModel,以包含我所有模型中共有的属性(即 created_at、modified_at)。然后我想创建一个扩展该 BaseModel 的用户模型。

但是,我遇到了一个问题,当我在 API Explorer 中查看我的“user.create”方法时,请求正文只显示 created_at 和 modified_at 的 BaseModel 属性,而不是用户名属性。

这是我所拥有的:

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])
4

1 回答 1

0

如果你去,http://localhost:8080/_ah/api/discovery/v1/apis/user/v1/rest你会看到你的 API 生成的发现文档。请注意(朝向底部)资源create上的方法user显示为采用 aBaseModel而不是 a 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 Explorer),您会注意到在此更改后收到create一条消息。User

于 2014-01-30T00:30:05.060 回答