интеллектуальная методология фильтрации на стороне сервера - PullRequest
0 голосов
/ 18 марта 2011

Мое отсутствие CS и неопытность действительно выходят на передний план в этот момент.Я никогда не занимался фильтрацией результатов на стороне сервера.Я думаю, что это не правильный путь.Я использую Django ....

Во-первых, я предполагаю, что могу сохранить его СУХОЙ, сохранив эту проверку в моих определениях формы.Затем я был обеспокоен своими цепочками операторов фильтра.Насколько важно использовать Q сложные поиски, а не цепочки фильтров на этом этапе?Я просто создаю прототип и предполагаю, что в конечном итоге мне придется искать решение, более мощное, чем полнотекстовый поиск.

Моя большая проблема сейчас (помимо длины кода и очевидной неэффективности) заключается в том, что я не уверен, как обращаться с входами в мои комнаты и рабочие, которые являются выбранными формами.Если пользователь не выбирает значение, я хочу удалить эти фильтры на стороне сервера процесса.Должен ли я просто создать две отдельные серии условных поисков для этих результатов?

def search(request):
   if request.method=='GET' and request.GET.get('region',''):
           neighborhoods=request.GET.getlist('region')
       min_rent=request.GET.get('min_cost','0')
       min_rent=re.sub(r'[,]','',min_cost)  #remove any ','
       if re.search(r'[^\d]',min_cost):
           min_cost=0
       else:
           min_cost=int(min_cost)

       max_cost=request.GET.get('max_cost','0')
       max_cost=re.sub(r'[,]','',max_cost)  #remove any ','
       if re.search(r'[^\d]',max_cost):
           max_cost=100000
       else:
           max_cost=int(max_rent)   


       date_min=request.GET.get('from','')  
       date_max=request.GET.get('to','')
       if not date_min:
           date=(str(datetime.date.today()))
           date_min=u'%s' %date
       if not date_max:
           date_max=u'2013-03-18'

               rooms=request.GET.get('rooms',0)
       if not rooms:
        rooms=0

       workers=request.GET.get('workers',0)
       if not workers:
           workers=0

    #I should probably use Q objects here for complex lookups
    posts=Post.objects.filter(region__in=region).filter(cost__gt=min_cost).filter(cost__lt=max_cost).filter(availability__gt=date_min).filter(availability__lt=date_max).filter(rooms=rooms).filter(workers=workers)
    #return HttpResponse('%s' %posts)

    return render_to_response("website/search.html",{'posts':posts),context_instance=RequestContext(request))   

1 Ответ

2 голосов
/ 18 марта 2011

Во-первых, я предполагаю, что могу сохранить его СУХОЙ, сохранив эту проверку в определениях моей формы.

Да, я бы изложил это в форме, как выглядит выв любом случае использовать один для отображения формы?Кроме того, вы можете поместить большую часть ваших данных о форматировании даты прямо в методы clean_FIELD, чтобы форматировать данные в диктовке cleaned_data.Единственная проблема здесь заключается в том, что выходные данные фактически изменены, поэтому ваши пользователи увидят изменение от 1000 до 1000. В любом случае, я бы поместил эту логику в метод формы.

# makes the view clean.
if form.is_valid():
    form.get_posts(request)
    return response

Моя большая проблемаПрямо сейчас (помимо длины кода и явно неэффективности), я не уверен, как обрабатывать входы в мои комнаты и рабочие, которые являются выборочными формами.Если пользователь не выбирает значение, я хочу удалить эти фильтры на стороне сервера процесса.Должен ли я просто создать две отдельные условные серии поисков для этих результатов?

Объекты Q предназначены только для сложных поисков.Я не вижу необходимости в них здесь.

Я также не понимаю, зачем вам цепочки фильтров.Сначала я задавался вопросом, являются ли они m2m, но эти типы запросов (__gt/__lt) не ведут себя по-разному, поскольку между запросами нет совпадений.

# this is more readable / concise. 
# I'd combine as many of your queries as you can just for readability.
posts = Posts.objects.filter(
        region__in=region,
        cost__gte=min_cost,
        # etc
    )

Теперь, если вы хотите опциональноАргументы, я предлагаю использовать словарь аргументов ключевых слов, чтобы вы могли динамически заполнять kwargs.

keyword_arguments = {
    'region__in': region,
    'cost__gte': min_cost,
    'cost__lt': max_cost,
    'availability__gt': date_min,
    'availability__lt': date_max,
}

if request.GET.get('rooms'):
    keyword_arguments['rooms'] = request.GET['rooms']

if request.GET.get('workers'):
    keyword_arguments['workers'] = request.GET['workers']

posts = Posts.objects.filter(**keyword_arguments)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...