【问题标题】:Get id of inserted object获取插入对象的id
【发布时间】:2013-03-19 18:20:02
【问题描述】:

我正在定义一个为用户建模的端点,如下所示。我可以通过 id 查询用户。但是插入用户时如何获取该ID?我的客户端是用 java 编写的,但我想知道如何使用 python 以及生成的 java 客户端库检索 id。

from google.appengine.ext import endpoints
from google.appengine.ext import ndb 
from protorpc import remote
from endpoints_proto_datastore.ndb import EndpointsModel

class User(EndpointsModel):
    email = ndb.StringProperty(required=True)
    phone_number = ndb.StringProperty()
    reg_id = ndb.StringProperty()
    created = ndb.DateTimeProperty(auto_now_add=True)

@endpoints.api(name='whereareyoudroid', 
               version='v1', description='Where Are You Users')
class UserApi(remote.Service):

    @User.method(name='user.insert', path='user')
    def insert(self, user):
        user.put()
        return user

    @User.method(request_fields=('id',), 
                 path='user/{id}', 
                 http_method='GET', name='user.get')
    def get(self, user):
        if not User.from_datastore:
            raise endpoints.NotFoundException('User not found.')
        return user

【问题讨论】:

  • 那些额外的前点只是将代码粘贴到问题中的产物吗?如果是,请删除它们
  • 是的,vim 的剩菜
  • 好的。感谢您修复。同时修复class. UserApi
  • 为什么这如此重要?
  • 这是一种错误的语法,当你运行你的代码时会产生一个SyntaxError。我编辑了它,所以它是正确的。其他人可以看到您的代码并从中学习很重要,因此正确的语法是相关的。

标签: python google-app-engine google-cloud-endpoints endpoints-proto-datastore


【解决方案1】:

首先,回答您的问题:

默认情况下,请求和响应的消息架构将是模型上的字段:emailphone_numberreg_idcreated。正如在simple get sample 中所做的那样,您可以通过

更改此默认值以包含id
class User(EndpointsModel):
    _message_fields_schema = ('id', 'email', 'phone_number', 
                              'reg_id', 'created')
    email = ndb.StringProperty(required=True)
    ...

或者通过在insert method中指定你想要返回的response fields

    @User.method(response_fields=('id', 'email', 'phone_number', 
                                  'reg_id', 'created'),
                 name='user.insert', path='user')
    def insert(self, user):
        user.put()
        return user

其次,您在get 中有一个错字/错误:

语句if not User.from_datastore: 将检查User 类上的User.from_datastore 属性对象是否“真实”,它就是。您需要用户对象上此属性的实际值:user.from_datastore

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-05
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多