0

在 EndpointsModel 上使用 endpoints-proto-datastore query_method 时,是否可以将不等式过滤器作为查询字段传递?

例如,假设我有一个带有lastmodified字段的模型,并且我想查询所有具有 的记录lastmodified > date,其中 date 是客户端传递给 API 的值。

class MyModel(EndpointsModel):
  attr1 = ndb.StringProperty()
  lastmodified = ndb.DateTimeProperty()

从我看到的文档来看,query_fields 似乎严格来说是一个相等过滤器。

4

1 回答 1

4

是的,但您需要使用EndpointsAliasProperty与字段不同的名称lastmodified。例如,您可以执行类似于在 Google I/O 2013 上用作示例的Picturesque 应用程序中所做的事情。

首先,定义你的模型

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(它需要在变量是引用之前出现,如在示例中):

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当然用于创建query_method传递给您的方法的查询。

另一种选择:

您可以只解析值并使用引入您自己的语法。例如,接受类似的字符串lastmodified>=TIMESTAMP,然后解析语句中的时间戳。

于 2013-06-25T04:00:20.463 回答