Создание диапазонов значений из отдельных чисел в django-фильтрах с помощью метода method = - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь создать фильтр диапазона значений в моем приложении, используя django-filters.В моей базе данных есть отдельные поля с возрастом (которые были созданы с помощью models.IntegerField).

Я хочу добавить флажок, как показано ниже: enter image description here

Все почти готово, но я не знаю, как связаться с базой данных.Я прочитал документацию о ' Настройка фильтрации с помощью Filter.method' и о том, как использовать RangeFilter , но я все еще не знаю, как создать правильное условие.Как я могу сделать это в моей стилизации (как создать условие для моих «требований =?»), Который возвращает значение, например, между 20-30?

У нас есть представление в документации:

f = F({'price_min': '5', 'price_max': '15'}, queryset=qs)

Что такое 'f'?где в этой ситуации условие достигает базы данных?

Мои filters.py

from .models import Promoters
import django_filters


class PromotersFilter(django_filters.FilterSet):

    CHOICES = (
        ('age_option1', '0-20'),
        ('age_option2', '21-30'),
        ('age_option3', '31-40'),
        ('age_option4', '41-50'),
        ('age_option5', '50+'),
    )

    age_list = django_filters.ChoiceFilter(label='Age list', choices=CHOICES, method='filter_by_order')

    class Meta:
        model = Promoters
        fields = ['age', 'profession', 'sex', 'city']

    def filter_by_order(self, queryset, name, value):
        requirements = **??**

        return queryset.order_by(requirements)

1 Ответ

0 голосов
/ 22 октября 2018

Вы можете использовать вспомогательную функцию следующим образом:

def get_age_range(option):
  if option == 'age_option1':
    return 0, 20
  elif option == 'age_option2':
    return 21, 30
  ...... and so on

, затем вызовите эту функцию по вашему мнению.

lower, upper = get_age_range(selected option)

queryset.filter(max_price>lower).filter(max_price<higher)

еще не проверял это.Как вы сказали, фильтр django может сделать это мягким способом.но это один из способов.

...