2013-06-25 2 views
0

При использовании метода end -s-proto-datastore query_method в EndpointsModel возможно ли, чтобы фильтр неравенства передавался как поле запроса?Endpoints Proto Datastore - Фильтр неравномерности на query_method

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

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

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

ответ

3

Да, но вам нужно использовать EndpointsAliasProperty с именем, отличным от поля lastmodified. Например, вы могли бы сделать что-то подобное было сделано в Picturesque app, используемой в качестве образца в 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 (она должна предшествовать переменная ссылка , как в 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, а затем разобрать временную метку из инструкции.