我想知道使用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对象进行就地更新的模式?
谢谢!
答案 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