更新端点中的现有实体 - 原型数据存储

时间:2013-07-09 01:23:36

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

我正在使用由Danny Hermes为Google App Engine编写的Endpoints-proto-datastore,需要帮助找出如何更新实体..我需要更新的模型如下

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.因此,每次评估主题时,我都需要更新每个评级属性。但是,我的属性都不是用户提供的实际评级。如何传递用户对主题进行评级的值,以便能够更新模型中的属性?谢谢!

1 个答案:

答案 0 :(得分:1)

您可以通过将rating与您的UserModel相关联的“别名”属性与<{1}}相关联来实现此目的:

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发送评分,但不会要求存储这些评分。

最好为用户使用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修饰的请求方法中对其进行更新。