过滤服务器端的智能方法

时间:2011-03-18 15:13:41

标签: django server-side

我缺乏CS和缺乏经验在这一刻真正成为最重要的。我从来没有真正处理过滤结果服务器端。我认为这不是正确的方法。我正在使用Django ......

首先,我假设我可以通过在表单定义中保留此验证来保持DRYer。接下来,我担心我的链式过滤器语句。在这一点上使用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 个答案:

答案 0 :(得分:2)

  

首先,我认为我可以保留它   DRYer将此验证保留在我的   表格定义。

是的,我会把它放在一个表单中,因为看起来你正在使用它来显示表单吗?此外,您可以在clean_FIELD方法中放置大量日期格式设置,以格式化cleaned_data字典中的数据。这里唯一的问题是输出实际上已被修改,因此您的用户将看到从1,000变为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)