1

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

4

1 回答 1

1

您可以通过拥有一个rating与您的关联的“别名”属性来做到这一点UserModel

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

您最好为用户使用 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.

于 2013-07-09T21:06:13.870 回答