我假设User
是从EndpointsModel
继承一些自定义模式。如果没有,这将失败。换句话说,你做了这样的事情:
from google.appengine.ext import ndb
from endpoints_proto_datastore.ndb import EndpointsModel
class User(EndpointsModel):
email = ndb.StringProperty()
...
有解决这个问题的两个主要途径,你既可以使用email
为重点的实体或滚你自己的查询,并尝试获取两个实体来查看你的结果是否是唯一的并且存在。
方法1:使用email
为重点
而不是做一个全面的查询,你可以做一个simple get。
from google.appengine.ext import endpoints
@endpoints.api(...)
class SomeClass(...):
@User.method(request_fields=('email',),
path='get_by_mail/{email}',
http_method='GET', name='user.get_by_email')
def get_by_email(self, user):
if not user.from_datastore:
raise endpoints.NotFoundException('User not found.')
return user
使用电子邮件作为每个实体的数据存储关键,因为在custom alias properties sample完成。例如:
from endpoints_proto_datastore.ndb import EndpointsAliasProperty
class User(EndpointsModel):
# remove email here, as it will be an alias property
...
def EmailSet(self, value):
# Validate the value any way you like
self.UpdateFromKey(ndb.Key(User, value))
@EndpointsAliasProperty(setter=IdSet, required=True)
def email(self):
if self.key is not None: return self.key.string_id()
选项2:滚你自己的查询
@User.method(request_fields=('email',),
path='get_by_mail/{email}',
http_method='GET', name='user.get_by_email')
def get_by_email(self, user):
query = User.query(User.email == user.email)
# We fetch 2 to make sure we have
matched_users = query.fetch(2)
if len(matched_users == 0):
raise endpoints.NotFoundException('User not found.')
elif len(matched_users == 2):
raise endpoints.BadRequestException('User not unique.')
else:
return matched_users[0]
但是后来,我可能想找到他的电话号码的用户。我会怎么做呢? – user672009 2013-03-19 21:17:32
也许我这样做完全错了。我想制作一个由用户Google帐户授权的Android应用程序,然后基本上有一个端点模型,该模型具有对该用户和电话号码的引用......建议? – user672009 2013-03-19 22:17:52
答复已更新。 – bossylobster 2013-03-19 22:30:39