0

我想知道使用 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

但是,“任务”可能包含先前存储的对象版本,我不清楚如何访问“新”详细信息变量来更新对象并重新存储它。

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

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

是否有使用 endpoints-proto-datastore 就地更新对象的模式?

谢谢!

4

2 回答 2

1

有关此内容的详细信息,请参阅文档

该属性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

将完全按照您的意图执行。

于 2014-04-06T22:12:43.040 回答
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
于 2014-04-01T15:01:44.923 回答