端点Proto数据存储 - query_method上的不等式过滤器

时间:2013-06-25 03:27:50

标签: endpoints-proto-datastore

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

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

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

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

1 个答案:

答案 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之类的字符串,然后从语句中解析时间戳。