• 01 Апр
  • 2015
Списки возможных значений и типы данных SimpleAPI
Это статья из серии "Simple API". Вы также можете почитать другие статьи из этой серии:
  1. API на Django со сложной структурой и прочими плюшками
  2. Списки возможных значений и типы данных SimpleAPI

В продолжение предыдущей статьи хочу рассказать о типах данных, с которыми работает SimpleAPI.

IntegerVariable

Принимает целочисленные данные, валидирует их и в случае указания данных неправильного формата возвращает сообщение "Wrong data type". Переменная по умолчанию обязательная к указанию (blank=False). Можно задавать дефолтные значения (default). Имеет метод get(), который возвращает значение, переданное в запросе. ВНИМАНИЕ! данное значение возвращается как строка (в следующих версиях модуля оно будет конвертироваться в Integer), поэтому нужно применять метод int().

CharVariable

Принимает любые последовательности символов. Нужно быть внимательным при передаче длинных данных методом GET, так как имеются ограничения. Этот тип данных также имеет параметры blank (по умолчанию False) и default, а также метод get(), возвращающий значение параметра. Строковый тип данных также имеет свойство choices, о котором немного позже.

BooleanVariable

Булево значение может иметь два состояния: истина и ложь. В качестве значений истины признаются значения: "True", "true", "1", в качестве значений лжи: "False", "false", "0". Все остальные строки, переданные этому параметру будут отвергаться с ошибкой "Wrong data type". Булевы значения также имеют свойства blank (по умолчанию False) и default, а также метод get().

AccessToken

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

Списки возможных значений

Часто возникает потребность создать параметры функции, которые будут переключать предусморенные режимы работы. Если таких режимов всего два, то можно обойтись и булевым значением, если же больше двух, то к вам на помощь придет свойство choices, доступное у всех типов данных, но имеющее смысл только с CharVariable. Свойство принимает список или кортеж возможных значений. Заметьте, что их порядок важен, поскольку в дальнейшем эти свойства будут использоваться по индексу в итерируемом объекте. Параметры, имеющие свойство choices получают метод case(i), который возвращает True, если значение параметра совпадает с i-тым элементом в choices или False в противном случае.

Приведем простой пример использования choices. Пускай у нас есть модель Project, в которой находятся некие проекты. Она имеет поля: <CharField> name, <BooleanField> active и несколько других. Создадим функцию API, которая будет возвращать эти проекты по признаку активности ("активные", "неактивные", "абсолютно все"). Также функция может возвращать объекты целиком, или же только кортежи с идентификатором (pk) и именем проекта (name).

#api_models.py
import simple_api
from main.models import Project

class GetProjects(simple_api.SimpleAPI):
    #  по умолчанию возвращает активные проекты
    filter = simple_api.CharVariable(blank=True, default='active', choices=['all', 'active', 'not_active', ])
    #  по умолчанию возвращает объекты целиком
    mode = simple_api.CharVariable(blank=True, default='object', choices=['object', 'name', ])

    def method(self):
        queryset = None
        if self.filter.case(0): #  если передано значение filter=all
            queryset = Project.objects.all() #  получаем все проекты
        elif self.filter.case(1): #  если передано значение filter=active
            queryset = Project.objects.filter(active=True) #  получаем активные проекты
        elif self.filter.case(2): #  если передано значение filter=not_active
            queryset = Project.objects.filter(active=False) #  получаем неактивные проекты
        if self.mode.case(0): #  если передано значение mode=object
            return queryset #  возвращаем queryset целиком
        elif self.mode.case(1): #  если передано значение mode=name
            return [(x.pk, x.name, ) for x in queryset] #  формируем и возвращаем список кортежей
                                                        #  с идентификаторами и именами проектов
comments powered by Disqus