【问题标题】:NDB, self and IntegerPropertyNDB、自我和 IntegerProperty
【发布时间】:2012-09-12 16:04:45
【问题描述】:

这是可笑的微不足道,但我花了半个小时试图解决它。

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_cmets 是 0,但在管理控制台中,它是 1。其他字段是正确的,除了这个。

“default=0”可能有问题,但我找不到问题所在。

编辑:我的函数的完整代码

def create_reply_comment(self,content,author): floodControl=memcache.get("FloodControl-"+str(author.key)) 如果洪水控制: 引发 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)  

【问题讨论】:

  • 但是当您创建日志时它仍然为 0,因为您还没有更新它?因此,当您签入管理控制台(可能是数据存储)时,它将为 1,因为您已将其递增。
  • 我第一次这样做很好,但是如果我创建另一个回复,self.total_cmets 在我访问它时始终为 0,因此它将 0+1 放入数据存储区,这显然是错误的,因为我想跟踪 cmets 的总数。
  • 好吧,您需要将 cmets 的总数存储在单个 cmets 之外,因为每次创建新评论时,它都会再次从 0 开始。因此,创建一个单独的模型来跟踪总 cmets,并在做出新评论时加载和增加它。分片计数器是一个很好的方法。 developers.google.com/appengine/articles/sharding_counters
  • 这是一个帖子,包含许多 cmets。 total_cmets 的数量存储在 SocialPost 中,而这里我正在创建一个新的 SocialComment。每次我创建新评论而不是在 SocialComment 中时,都会在现有的(并且应该是相同的)SocialPost 上调用此函数,正如您所假设的那样。
  • create_reply_comment 开头发生了什么,调用该函数的代码是什么?您实际上是在“先获取 SocialPost”,还是只是在同一个键上书写?

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


【解决方案1】:

您在更改 total_cmets 之前调用了 memcache.add,因此当您在后续调用中从 memcache 中读取它时,您会从缓存中获取一个过时的值。您的 create_reply_comment 需要删除或覆盖 "SocialPost-"+str(self.request.get('post') 缓存键。

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

【讨论】:

  • 这是新开发银行。 model.Model 是由于在它实际包含在正式发布或类似的东西之前实现它的技巧。不管怎样,谢谢,我要试试这个。无论如何,“它的东西”是什么意思?
  • 当你执行 Entity.get_by_id() 或 Key().get() 时,NDB 将自动使用 memcache,当你放置或删除它时,它会清除相应的缓存条目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多