Django:使用Q进行过滤,并考虑到空选择场景

2024-10-01 13:24:10 发布

您现在位置:Python中文网/ 问答频道 /正文

用户输入并提交的表单中有两个条件用于筛选数据库。因为用户可能会留下这两个空白,所以我做了一些场景。如果为空,则在数据库中不需要按此约束进行过滤。你知道吗

默认值为“无”。你知道吗

这是我引用的帖子: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)

查询集=三十、 对象.过滤器(仅|标准|无|仅|标准|无|均选|均|无)

方法3---编辑

你知道吗表单.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())

-----国家相同------默认值为“”

你知道吗视图.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])
。。。。。。。。。。

提前谢谢。你知道吗


Tags: andnonetruedatereturnifobjectsis
1条回答
网友
1楼 · 发布于 2024-10-01 13:24:10

我不太明白为什么您需要使用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

这使您的查询看起来更容易理解。你知道吗

相关问题 更多 >