Как выполнять пользовательские запросы в API конечных точек google appengine, используя "endpoints-proto-datastore"?

Обычно мы делаем такие запросы

@MyModel.query_method(path='mymodels', name='mymodel.list')
def MyModelList(self, query):
   return query

Но как я могу выполнить пользовательские запросы к модели конечных точек и как передать пользовательские параметры, отличные от "id, limit, order..." и т. Д.

Например:

return query.filter(Student.name == somename )

Как я могу поставить "somename" в конечную точку?

1 ответ

Решение

Если свойство, по которому вы хотите выполнить фильтрацию, является частью вашей модели, вы можете просто добавить имя в качестве query_field

@MyModel.query_method(path='mymodels',
                      name='mymodel.list',
                      query_fields=('name',))

Это автоматически применит фильтр равенства (MyModel.name == name) если имя указано в запросе API.

Если вам нужно больше пользовательских запросов, вы можете работать с EndpointsAliasProperty на вашей модели и прямой доступ к модели _endpoints_query_info._filters

Пример выполнения фильтра неравенства с датой:

class MyModel(EndpointsModel):

    ...
    updated = EndpointsDateTimeProperty(auto_now=True)
    ...

    def MinDateSet(self, value):
        if value is not None:
            self._endpoints_query_info._filters.add(MyModel.updated >= value)

    @EndpointsAliasProperty(setter=MinDateSet,
                            property_type=message_types.DateTimeField)
    def minDate(self):
        """
        minDate is only used as parameter in query_methods
        so there should never be a reason to actually retrieve the value
        """
        return None


@MyModel.query_method(path='mymodels',
                      name='mymodel.list',
                      query_fields=('minDate',))

Это автоматически применит MyModel.updated >= minDate фильтр, если minDate указан в запросе API.

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