1

我想創建一個BaseModel,它是一個EndpointsModel以包含所有模型(即created_at,modified_at)共有的屬性。然後我想創建一個擴展該BaseModel的用戶模型。當擴展EndpointsModel時,不會出現子類屬性

但是,我遇到了一個問題,當我在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) 

下面是使用谷歌雲端點內置的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

如果你去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的東西,使得更加明確這是一個混入了。

如果您檢查相同的發現文檔(或API資源管理器),您會注意到create在此更改後會收到User消息。

+1

這似乎是一個錯誤?繼承應該「正常工作」。 – bossylobster

+0

@bossylobster是的,我認爲是。 –

+0

文件錯誤? https://github.com/GoogleCloudPlatform/endpoints-proto-datastore/issues/new – bossylobster