@AntonIgin

Как искать экзмемпляры объектов по пустым полям?

У меня есть форма, в которой есть несколько необязательных фильтров: возраст, цвет глаз, знак зодиака и т.п. Если пользователь не стал указывать все это, фильтрации по указанному параметру не будет.

И вот тут проблема: эти поля необязательны не только для формы поиска, но и формы регистрации, то есть возможны анкеты с пустыми значениями.
Чтобы фильтровать по возрасту, я сделал так (знаю, что надо классовыми, но переписывать потом буду):

def new_services_search(request, name='', ages=['18_24', '24_35', '36_42', '43+', None]):
    if request.method=='POST':
        data = request.POST
        name = data.get('name')
        if data.get('age'):
            age = list(data.getlist('age'))
        filter_girls = Profile.objects.filter(available=True, name__istartswith=name,age__in=ages)


Суть думаю, понятна. Если пользователь указал диапазоны нужных возрастов, то фильтруем по ним, если нет, фильтруем по списку из шапки функции. Вот только анкеты с пустыми значениями не проходят, хотя None в списке есть, и проверка проблемного профиля в shell командой вроде test.age==None показала, что таки True. А вот во вьюхе становится "не тру".

Что делать?
  • Вопрос задан
  • 165 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
Код - грубый набросок и требует доводки, но вам нужно что-то вроде, насколько я понимаю:
from django.db.models import Q

# Это лучше хранить где-нибудь в базе, а не в коде
DEFAULTS = {
    'name': '',
    'age': ['18_24', '24_35', '36_42', '43+', None],
    'eye': None,
}

def new_services_search(request):
    if request.method=='POST':
        filters = []
        for k in request.POST:
            kwargs = {}
            v = request.POST.get(k, DEFAULTS[k])
            if v is None:
                kwargs[k + '__isnull'] = True
            elif isinstance(v, list):
                kwargs[k + '__in'] = v
            else:
                kwargs[k] = v
            filters.append(Q(**kwargs))
        filter_girls = Profile.objects.filter(filters)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы