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