Конечная точка 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
а затем проанализировать метку времени из заявления.