在EndpointsModel上使用endpoints-proto-datastore query_method时,是否可以将不等式过滤器作为查询字段传递?
例如,假设我有一个带有lastmodified
字段的模型,我想查询所有具有lastmodified > date
的记录,其中date是客户端传递给API的值
class MyModel(EndpointsModel):
attr1 = ndb.StringProperty()
lastmodified = ndb.DateTimeProperty()
从我看到的文档中,看起来query_fields严格来说是一个相等的过滤器。
答案 0 :(得分:4)
是的,但您需要使用名称与EndpointsAliasProperty
字段不同的lastmodified
。例如,您可以执行类似于在Google I / O 2013中用作示例的Picturesque app中所做的事情。
首先,定义您的模型
from google.appengine.ext import ndb
from endpoints_proto_datastore.ndb import EndpointsModel
class MyModel(EndpointsModel):
attr1 = ndb.StringProperty()
lastmodified = ndb.DateTimeProperty()
然后创建一个别名属性,用于更新查询
from google.appengine.ext import endpoints
from endpoints_proto_datastore.ndb import EndpointsAliasProperty
...
@EndpointsAliasProperty(name='modifiedSince', setter=ModifiedSinceSet)
def ModifiedSince(self):
raise endpoints.BadRequestException(
'modifiedSince value should never be accessed.')
这个属性永远不会被访问,但它的setter与我们想要的查询排序相关,所以我们需要定义ModifiedSinceSet
(它需要在变量引用之前,如the sample):
import datetime
from endpoints_proto_datastore import utils
...
def ModifiedSinceSet(self, value):
try:
modified_since = utils.DatetimeValueFromString(value)
if not isinstance(modified_since, datetime.datetime):
raise TypeError('Not a datetime stamp.')
except TypeError:
raise endpoints.BadRequestException('Invalid timestamp for modifiedSince.')
self._endpoints_query_info._filters.add(
MyModel.lastmodified >= modified_since)
这里我们将传入的值(从请求中)转换为datetime.datetime
对象,然后使用它将过滤器添加到当前self._endpoints_query_info._filters
对象上的EndpointsModel
。
此_endpoints_query_info
当然使用in query_method
来创建传递给您的方法的查询。
您可以解析该值并使用介绍您自己的语法。例如,接受lastmodified>=TIMESTAMP
之类的字符串,然后从语句中解析时间戳。