用户输入和提交的表单中有2个条件用于过滤数据库。因为用户可能会将这两个留空,所以我做了一些场景。如果它留空,那么在数据库中无需按此约束进行过滤。
默认值为“无”。
这是我引用的帖子:django conditionally filtering objects
我试过两种方式,既不起作用,也希望有人可以提供帮助:
第一种方式
if criteria_1 is None and criteria_2 !=None: return Q(criteria_2=criteria_2)
elif criteria_2 is None and criteria_1 !=None: return Q(criteria_1=criteria_1)
elif criteria_1 !=None and criteria_2 !=None: return Q(criteria_2=criteria_2,criteria_1=criteria_1)
elif criteria_1 is None and criteria_2 is None: return Q()
else: return Q()
queryset=XXX.objects.filter(Q,date_new__range=[start_date,end_date])
第二种方式
only_criteria_1_none=Q(criteria_1__isnull=True)
only_criteria_2_none=Q(criteria_2__isnull=True)
both_selected=Q(criteria_1=criteria_1,criteria_2=criteria_2)
both_none=Q(criteria_1__isnull=True,criteria_2__isnull=True)
查询集= XXX.objects.filter(only_criteria_1_none | only_criteria_2_none | both_selected | both_none)
方法3 ---编辑
forms.py
iquery = XXX.objects.values_list('region', flat=True).distinct()
iquery_choices = [('', '')] + [(region,region) for region in iquery]
region = forms.ChoiceField(choices=iquery_choices,required=False,widget=forms.Select())
-----国家相同------默认值为“”
views.py
if country =="" and region !="":
queryset=XXX.objects.filter(country,date_new__range=[start_date,end_date])
if region ="" and country !="":
queryset=XXX.objects.filter(region,date_new__range=[start_date,end_date])
。。。。。。。。。。
提前致谢。
答案 0 :(得分:3)
我不太明白为什么你需要使用Q
,django的查询集是如此懒洋洋地完成的,所以它不会运行直到你真正需要结果。
queryset = Foo.objects.filter(base_query_stuff)
if bar_criteria:
queryset = queryset.filter(bar_stuff)
if cheese_criteria:
queryset = queryset.filter(cheese_stuff)
return queryset
这使您的查询看起来更容易理解。