Как написать динамический c django orm набор запросов на основе пройденных фильтров? - PullRequest
0 голосов
/ 14 февраля 2020

Мне нужно применить фильтры динамически к набору запросов в зависимости от фильтров, переданных как json от внешнего интерфейса.

для примера.

, если передано json: { id: [1,2,3]}, тогда набор запросов будет: Model.objects.filter (id__in = id)

, если json передано как: {id: [1,2,3], страна: ['india', 'australia']}

тогда набор запросов будет: Model.objects.filter (id__in = id, country__in = country)

как этого добиться динамически?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2020

Просто используйте django_filters

from django_filters import rest_framework as filters    

class ContentFilter(filters.FilterSet):
    id = filters.NumberFilter(lookup_expr="in")
    country = filters.CharFilter(lookup_expr="in")

    class Meta:
        model = <your_model>
        fields = ['id', 'country']

Затем добавьте в ваше представление класс

filterset_class = ContentFilter
0 голосов
/ 14 февраля 2020

Вы можете использовать оператор if / else, чтобы определить, пуст ли список стран:

if not country:
     Model.objects.filter(id__in=id)
else:
     Model.objects.filter(id__in=id, country__in=country)

Редактировать:

В комментарии указывалось, что сумма фильтров динам c. Таким образом, в Django .filter() возвращается еще QuerySet, а наборы запросов лениво оцениваются, то есть они могут быть связаны и использоваться в oop.

Таким образом, используя распаковку (**), мы можем составить kwargs для перехода к .filter().

Поскольку точный тип данных / схема фильтров не предусмотрено, я буду использовать словарь в качестве примера, filter_dictionary. В этом словаре key - это фильтр, который будет использоваться, а value - список.

# Compose first Queryset
qs = Model.objects.all()

# Loop over dictionary
for key, value in filter_dictionary.items():

    # Use unpacking to compose kwarg
    qs.filter(**{'{0}__in'.format(key): value})

# do something with the QuerySet
...