django:使用Q过滤考虑空白选择场景

时间:2015-11-02 08:04:58

标签: python mysql django

用户输入和提交的表单中有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])
。。。。。。。。。。

提前致谢。

1 个答案:

答案 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

这使您的查询看起来更容易理解。