Фильтрация Tastypie с несколькими значениями

У меня был простой вопрос о фильтрации в tastypie.

Я хочу фильтровать несколько значений. Например:

/api/v1/message/?accountId=1,5,12

Это не работает. Любая идея, как я могу это сделать?

Нужно ли использовать расширенную фильтрацию? Если да, то как я могу создать такой фильтр? Простой легкий пример puesdo-кода будет замечательным!

Спасибо!

Ответы

Ответ 1

Хм,

Вы можете сделать это:

/api/v1/message/?accountId__in=1&accountId__in=5&accountId__in=12

PS: при фильтрации мета атрибута добавьте {'accountId': ALL}

Ответ 2

Вам нужно будет создать и применить фильтр. Здесь небольшой фрагмент, лучше построить фильтр в build_filters, а затем применить его в apply_filters, но вы получите идею

class Foo(ModelResource):

    # regular stuff goes here...

    def apply_filters(self, request, applicable_filters):
        base_object_list = super(Foo, self).apply_filters(request, applicable_filters)
        query = request.GET.get('query', None)
        ids = request.GET.get('ids', None)
        filters = {}
        if ids:
            ids = ids.replace('+', ' ').split(' ')
            filters.update(dict(id__in=ids))
        if query:
            qset = (
                Q(title__icontains=query, **filters) |
                Q(description__icontains=query, **filters)
            )
            base_object_list = base_object_list.filter(qset).distinct()
        return base_object_list.filter(**filters).distinct()

Ответ 3

Самая последняя версия, похоже, работает довольно легко - просто используйте "__in":

/api/v1/message/?accountId__in=1,5,12

(Я предполагаю, что вам понадобится запись в ваших ресурсах. Meta-класс, filtering = {'accountId': ALL})

Ответ 4

/api/v1/message/?accountId__in=1,5,12
это правильный путь для меня, это легко и просто.

/api/v1/message/?accountId__in=1&accountId__in=5&accountId__in=12
этот путь странный и выглядит уродливым.

конечно, вам нужно добавить filtering = { 'accountId' : ALL } в ресурс META.

Ответ 5

Вы должны объявить столбцы фильтрации в классе Meta​​strong > . Это правило безопасности по неизвестности.

Таким образом, правило accountId__in = [..] является одним из них.

`` ` filtering = {'accountId': ALL} ИЛИ filtering = {'accountId': [..., 'in']}

`` `