2

我試圖將屬性傳遞到未包含在我的EndpointsModel中的API調用。例如,假設我有以下型號:使用端點 - 原型數據存儲,如何將屬性傳遞給未包含在端點模型中的方法

class MyModel(EndpointsModel): 
    attr1 = ndb.StringProperty() 

然後假設我想在attr2以作爲參數傳遞,但我不想attr2被用作過濾我也不希望它被保存在模型中。我只是想傳入一些字符串,在方法中檢索它並使用它來執行一些業務邏輯。

該文檔描述了用於指定要傳入方法的字段的query_fields參數,但這些參數似乎與模型中包含的屬性耦合,因此您無法傳入未在模型中指定的屬性。

同樣,文檔指出,可以在屬性通過路徑變量傳遞:

@MyModel.method(request_fields=('id',), 
       path='mymodel/{id}', name='mymodel.get' 
       http_method='GET') 
def MyModelGet(self, my_model): 
    # do something with id 

但是這需要你改變URL,再加上這似乎有相同的約束作爲query_fields(該屬性必須存在於模型中)。

回答

7

對於這個用例,EndpointsAliasPropertycreated。它的行爲非常類似於Python中的@property,因爲您可以指定getter,setter和doc,但在此上下文中未指定刪除程序。

由於這些屬性將通過網絡發送並與Google API基礎結構一起使用,因此必須指定類型,因此我們不能只使用@property。此外,我們需要的典型屬性/字段元數據,如repeatedrequired

它的使用一直documented的樣本之一,但對你的具體使用情況,

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

class MyModel(EndpointsModel): 
    attr1 = ndb.StringProperty() 

    def attr2_set(self, value): 
    # Do some checks on the value, potentially raise 
    # endpoints.BadRequestException if not a string 
    self._attr2 = value 

    @EndpointsAliasProperty(setter=attr2_set) 
    def attr2(self): 
    # Use getattr in case the value was never set 
    return getattr(self, '_attr2', None) 

由於沒有property_type的值傳遞給EndpointsAliasProperty,使用默認值protorpc.messages.StringField。如果您想要一個整數,您可以改爲使用:

@EndpointsAliasProperty(setter=attr2_set, property_type=messages.IntegerField) 
+0

這是什麼意思?也許你應該問一個新問題。 – bossylobster 2013-11-03 17:28:19

+0

如果我希望我的財產是隻讀的,我可以忽略'setter'屬性嗎? – Bugs 2015-09-18 15:01:33

+0

是的。您還可以控制哪些方法與之交互,但setter實際上是從請求中獲取值並將其從protorpc對象移動到ndb模型對象。 – bossylobster 2015-09-18 15:49:43

相關問題