用于更新数据存储区对象的模式

时间:2014-03-06 07:52:18

标签: endpoints-proto-datastore

我想知道使用endpoints-proto-datastore更新现有数据存储区对象应该是什么样的正确模式。

例如,给定一个类似GDL视频中的模型:

class Task(EndpointsModel):
    detail = ndb.StringProperty(required=True)
    owner = ndb.StringProperty()

想象一下,我们想要更新任务的“细节”。

我考虑过这样的事情:

@Task.method(name='task.update',
             path='task/{id}',
             request_fields=('id', 'detail'))
def updateTask(self, task):
    pass

但是,'task'可能包含先前存储的对象版本,我不清楚如何访问用于更新对象并重新存储它的'new'细节变量。

换句话说,我想写这样的东西:

def updateTask(self, task_in_datastore, task_from_request):
    task_in_datastore.detail = task_from_request.detail
    task_in_datastore.put()

是否存在使用endpoints-proto-datastore对象进行就地更新的模式?

谢谢!

2 个答案:

答案 0 :(得分:1)

有关此

的详细信息,请参阅documentation
  

属性id是默认提供的五个辅助属性之一   帮助您执行这样的常见操作(通过ID检索)。在   另外还有一个entityKey属性,它提供了base64   数据存储区密钥的编码版本,可以在类似的中使用   时尚为id ......

这意味着如果使用默认的id属性,将检索当前对象,然后请求中的任何更新将替换当前对象上的更新。因此,做最琐碎的事情:

@Task.method(name='task.update',
             path='task/{id}',
             request_fields=('id', 'detail'))
def updateTask(self, task):
    task.put()
    return task

将完全符合您的预期。

答案 1 :(得分:0)

任务是你的模型,你可以像这样轻松更新:

@Task.method(name='task.update',
         path='task/{id}',
         request_fields=('id', 'detail'))
def updateTask(self, task):
    # Task.get_by_id(task.id)
    Task.detail = task.detail
    Task.put()
    return task