【问题标题】:Subclass properties don't appear when extending EndpointsModel扩展 EndpointsModel 时不出现子类属性
【发布时间】:2014-01-28 19:26:05
【问题描述】:

我想创建一个作为 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])

【问题讨论】:

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


    【解决方案1】:

    如果您访问http://localhost:8080/_ah/api/discovery/v1/apis/user/v1/rest,您将看到由您的 API 生成的发现文档。请注意(朝向底部)user 资源上的create 方法显示为采用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 重命名为更明确的名称是有意义的,现在它是一个 mixin。

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

    【讨论】:

    猜你喜欢
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 2013-10-10
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多