Как правильно проверить, использовался ли фильтр пользователем для добавления в фильтры в бэкэнде Django? - PullRequest
0 голосов
/ 17 мая 2019

Я запрашиваю предложение о том, как определить, какие фильтры используются пользователем, система фильтрации может иметь различные параметры для получения данных, но с помощью операторов if, чтобы проверить, входит ли значение в POST, а затем добавить это для набора фильтров не очень хороший вариант, особенно когда их много.

# Some if statements detecting if a filter is used (if it is not null in the POST)
# Adding the filter to filters

filters = {
# filters after being added
            '{}__{}'.format('categories', 'exact'): request.POST['category'],
            '{}__{}'.format('price', 'gte'): request.POST['price'], # Only an example
        }
        products = Product.objects.filter(**filters)

Это работает, но я просто хочу знать, что бы вы порекомендовали.

Ответы [ 2 ]

2 голосов
/ 17 мая 2019

Если бы я правильно понял ваш вопрос, я бы цепочка фильтров вместо:

queryset = Product.objects.all()

if 'category' in request.POST:
    queryset.filter(categories__exact=request.POST['category'])

if 'price' in request.POST:
    queryset.filter(price__gte=request.POST['price'])
1 голос
/ 17 мая 2019

Чтобы расширить предложение Гасанова:


possible_filters = {
    'category': 'exact',
    'price': 'gte',
    # etc. Not sure if this can be done any smarter
    # maybe if you pass `cateogry__exact` in the POST data instead of just `category`?
}

queryset = Product.objects.all()
for key, val in request.POST.items():
    if key in possible_filters:
        filter_kwargs = {
            f'{key}__{possible_filters[key]}': val,
        }
        queryset = queryset.filter(**filter_kwargs)

Или вы можете собрать kwargs и сделать один звонок на filter. Если вы не фильтруете обратные отношения FK или отношения M2M, они почти одинаковы (документы, когда они не совпадают, здесь )

filter_kwargs = {}
for key, val in request.POST.items():
    if key in possible_filters:
        filter_key = f'{key}__{possible_filters[key]}'
        filter_kwargs[filter_key] = val
queryset = queryset.filter(**filter_kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...