我有搜索字段、关键字、开始日期、结束日期。 它们可以为空。我想要的是,如果输入关键字,获取结果-唯一包含结果的关键字。如果未输入关键字但输入了cdate\U start,则仅获取大于此cdate\U start的项目。或者输入关键字和cdate\u end,然后get items只包含这个关键字,小于cdate\u end,等等。我必须得到所有这样的组合。 我试过这样的东西
if self.request.GET.get('feedback_s_keyword') is not None:
keyword = self.request.GET.get('feedback_s_keyword')
else:
keyword = ''
name_or = Q(author__name__icontains=keyword)
surname_or = Q(author__surname__icontains=keyword)
feedback_or = Q(feedback__icontains=keyword)
if self.request.GET.get('feedback_s_cdate_start') is not None:
cdate_start = self.request.GET.get('feedback_s_cdate_start')
cdate_start = cdate_start.split('/')
try:
year_s = cdate_start[0]
month_s = cdate_start[1]
day_s = cdate_start[2]
except:
year_s = 2001
month_s = 1
day_s = 1
else:
year_s = 2001
month_s = 1
day_s = 1
cdate_gte = Q(cdate__gte=datetime.date(year_s, month_s, day_s))
if self.request.GET.get('feedback_s_cdate_end') is not None:
cdate_end = self.request.GET.get('feedback_s_cdate_end')
cdate_end = cdate_end.split('/')
try:
year_e = cdate_end[0]
month_e = cdate_end[1]
day_e = cdate_end[2]
except:
year_e = 3000
month_e = 12
day_e = 31
else:
year_e = 3000
month_e = 12
day_e = 31
cdate_lte = Q(cdate__lte=datetime.date(year_e, month_e, day_e))
feedbacks = Feedback.objects.filter(name_or | surname_or | feedback_or | cdate_gte | cdate_lte).order_by(
"-cdate")
当然,如果没有输入cdate,它会返回所有内容。我想我可以设置标志smth,比如关键字\u entered=True,反馈\u s\u cdate\u start\u entered=True,反馈\u s\u cdate\u end\u entered=True 以及写入多个if条件,并基于这些标志生成过滤器
if keyword_entered and not feedback_s_cdate_start_entered and not feedback_s_cdate_end_entered:
feedbacks = Feedback.objects.filter(name_or | surname_or | feedback_or ).order_by(
"-cdate")
elif keyword_entered and feedback_s_cdate_start_entered and not feedback_s_cdate_end_entered:
feedbacks = Feedback.objects.filter(name_or | surname_or | feedback_or | cdate_gte).order_by(
"-cdate")
上述解决方案看起来不太好。我怎样才能创建这样的搜索呢
由于使用的逻辑混乱,您的任务变得更加困难(同样,使用表单比手动清理所有这些数据要容易得多)。编写更简单的逻辑:
相关问题 更多 >
编程相关推荐