0

对于我的应用程序,我们让用户对问题进行投票,并使用单独的数据存储来进行投票和问题。我希望在用户投票(或更改其原始投票)时更新上下投票总数,我试图通过在Vote.Method. 为此,我进行了以下交易:

@ndb.transactional
def GetToChange(vote):
    key = ndb.Key('Issue', vote.IID)
    issue = key.get()
    return issue

然后,在@Vote.Method我调用事务函数中:

@Vote.method(request_fields=('UID', 'IID', 'Vote'), name='vote.add', path ='addvote')
def AddVote(self, vote):
   vote.put()
   i = GetToChange(vote)
   if newvote.Vote == True:
      i.UpTotal += 1
   if newvote.Vote == False:
      i.DownTotal += 1
   i.put()
   return vote

但是,这总是给我一个 503 错误,并且在日志中我发现“NoneType 我没有属性 UpTotal”,这表明没有检索到实体。我究竟做错了什么?

编辑:更多详细信息 这@Vote.method 需要用户 ID (UID)、问题 ID(问题数据存储中问题的 ID)和请求中的布尔值“投票”。投票存储在 vote.put() 中。然后,我使用请求中的 IID 调用我的事务方法来检索问题。我在代码中添加了更多内容,以显示我要解决的问题。

4

1 回答 1

0

对了,整理!问题与我在 Vote 模型中使用的 IID 属性有关,这就是它永远无法检索到正确问题的原因。

在投票模型中,我将 IID 更改为ndb.KeyProperty(kind=Issue). 但是,尝试使用数据存储中的整数 ID 不起作用;正如我上面评论的那样,这给出了一个ProtocolBufferDecodeError "corrupted". 但是,在请求中传递 64 位 entitykey 是有效的!因此,现在 API 使用带有问题的 entityKey 辅助属性。

于 2013-07-20T10:46:55.300 回答