获取插入对象的id

时间:2013-03-19 18:20:02

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

我正在定义一个为用户建模的端点,如下所示。我可以通过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

1 个答案:

答案 0 :(得分:4)

首先,回答你的问题:

默认情况下,您的请求和响应的消息架构将是您模型上的字段: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.from_datastore类上的User属性对象是否为“truthy”,它是什么。您希望在用户对象上使用此属性的实际值:user.from_datastore