Конечная точка Proto Datastore - фильтр неравенства для метода query_method

При использовании endpoints-proto-datastore query_method на EndpointsModel, возможно ли иметь фильтр неравенства, переданный как поле запроса?

Например, скажем, у меня есть модель с lastmodified поле, и я хочу запросить все записи, которые имеют lastmodified > dateгде date - это значение, переданное API клиенту.

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

Из документации, которую я видел, кажется, что query_fields является строго фильтром равенства.

1 ответ

Решение

Да, но вам нужно будет использовать EndpointsAliasProperty с именем, отличным от lastmodified поле. Например, вы можете сделать что-то похожее, что было сделано в приложении Picturesque, используемом в качестве примера на Google I/O 2013.

Сначала определите вашу модель

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.')

К этому свойству никогда не будет доступа, но его установщик важен для сортировки запроса по тому, что мы хотим, поэтому нам нужно определить 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 а затем проанализировать метку времени из заявления.

Другие вопросы по тегам