NDB,self和IntegerProperty

时间:2012-09-12 16:04:45

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

这太荒谬了,但我花了半个小时试图解决它。

class SocialPost(model.Model):
  total_comments=model.IntegerProperty(default=0)

def create_reply_comment(self,content,author):
    ...
    logging.info(self)
    self.total_comments=self.total_comments+1
    self.put()

在日志文件中,我可以看到total_comments是如何为0但在管理控制台中,它是1.其他字段是正确的,除了这个。

可能是“默认= 0”有问题,但我找不到有什么问题。

编辑:我的功能的完整代码

def create_reply_comment(self,content,author):         floodControl = memcache.get( “FloodControl - ” + STR(author.key))         如果floodControl:             raise base.FloodControlException

    new_comment= SocialComment(parent=self.key)
    new_comment.author=author.key
    new_comment.content=content
    new_comment.put()

    logging.info(self)
    self.latest_comment_date=new_comment.creation_date
    self.latest_comment=new_comment.key
    self.total_comments=self.total_comments+1
    self.put()
    memcache.add("FloodControl-"+str(author.key), datetime.now(),time=SOCIAL_FLOOD_TIME)

我称之为功能:

if cmd == "create_reply_post":
           post=memcache.get("SocialPost-"+str(self.request.get('post')))
           if post is None:
              post=model.Key(urlsafe=self.request.get('post')).get()
              memcache.add("SocialPost-"+str(self.request.get('post')),post)
           node=node.get()
           if not node.get_subscription(user).can_reply:
               self.success()
               return


           post.create_reply_comment(feedparser._sanitizeHTML(self.request.get("content"),"UTF-8"),user)  

1 个答案:

答案 0 :(得分:0)

在对total_comments进行更改之前,您正在调用memcache.add,因此当您在后续调用中从memcache读回时,您将从缓存中获取过时的值。您的create_reply_comment需要删除或覆盖"SocialPost-"+str(self.request.get('post')缓存密钥。

[edit]虽然你的帖子标题说你正在使用NDB(虽然是model.Model?嗯。),所以你可以完全跳过memcache位,让NDB做到这一点?