1

我正在使用Danny Hermes爲Google App Engine編寫的端點原型數據存儲,並需要幫助瞭解如何更新實體。我需要更新的模型是以下更新端點中的現有實體 - 原型數據存儲

class Topic(EndpointsModel): 
    #_message_fields_schema = ('id','topic_name','topic_author') 
    topic_name = ndb.StringProperty(required=True) 
    topic_date = ndb.DateTimeProperty(auto_now_add=True) 
    topic_author = ndb.KeyProperty(required=True) 
    topic_num_views = ndb.IntegerProperty(default=0) 
    topic_num_replies = ndb.IntegerProperty(default=0) 
    topic_flagged = ndb.BooleanProperty(default=False) 
    topic_followers = ndb.KeyProperty(repeated=True) 
    topic_avg_rating = ndb.FloatProperty(default=0.0) 
    topic_total_rating = ndb.FloatProperty(default=0.0) 
    topic_num_ratings = ndb.IntegerProperty(default=0) 
    topic_raters = ndb.KeyProperty(repeated=True) 

正如你所看到的,評級屬性都爲0這樣的話題被評爲每次默認情況下,我需要更新每個等級的屬性。但是,我的任何屬性都不是用戶提供的實際評分。我如何傳遞用戶對主題的評價以便能夠更新模型中的屬性的值?謝謝!

from endpoints_proto_datastore.ndb import EndpointsAliasProperty 

class UserModel(EndpointsModel): 

    ... 

    def rating_set(self, value): 
     # Do some validation 
     self._rating = value 

    @EndpointsAliasProperty(setter=rating_set) 
    def rating(self): 
     return self._rating 

這將使評級與UserModel S IN請求被髮送,但不需要那些評級爲:

+0

丹尼在這裏。你基本上需要兩件事 - 評價者和評級 - 被髮送?從'topic_raters'我推測評價者會是一個'KeyProperty',評級將是一個float或int? – bossylobster

+0

@bossylobster是的,這是正確的。我需要傳入用於擴展用戶對象的用戶配置文件實體的鍵,該用戶對象是名爲UserProfile的模型。我需要通過用戶選擇的評分。我也使用了我設置的端點JavaScript客戶端庫,如果這改變了任何東西。所以考慮到用戶評分爲3分(滿分5分),我需要在total_rating中加3,在num_ratings中加1,並根據這兩種評分更新avg_rating。然後將用戶的配置文件密鑰添加到評估者。謝謝! – vol4life27

回答

1

可以通過讓被稱爲rating的「別名」屬性與UserModel相關做到這一點存儲。

您最好爲用戶使用OAuth 2.0令牌,並調用endpoints.get_current_user()來確定用戶在請求中的位置。

喜歡的東西對評級的專用模型可能是更容易:

from endpoints_proto_datastore.ndb import EndpointsUserProperty 

class Rating(EndpointsModel): 
    rater = EndpointsUserProperty(raise_unauthorized=True) 
    rating = ndb.IntegerProperty() 
    topic = ndb.KeyProperty(kind=Topic) 

,然後檢索事務從數據存儲Topic並通過@Rating.method裝飾的請求方法更新它。

+0

謝謝@bossylobster! – vol4life27

相關問題