我缺乏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))
答案 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)