django 向搜索函数添加布尔值

gijlo24d  于 2023-04-07  发布在  Go
关注(0)|答案(1)|浏览(92)

我有一个多过滤器函数,它返回基于4个参数的诊所结果。我想添加第5个参数,即BooleanField(在模型和表单中)。
如果True,我希望该字段返回相应的元素,但如果False,则根据独立于此BooleanField的其他搜索参数返回所有元素。

if request.htmx:
    name = request.GET.get('name')
    city = request.GET.get('city')
    ward = request.GET.get('ward')
    speciality = request.GET.get('speciality')
    english = request.GET.get('english')
    print(f'english: {english}')
    if all([len(name) == 0, len(city) == 0, len(ward) == 0, len(speciality) == 0]):
        qs = None
    else:
        qs = Clinic.objects.filter(Q(name__icontains=name) &
                                   Q(city__icontains=city) &
                                   Q(ward__icontains=ward) &
                                   Q(speciality__icontains=speciality))

我尝试将英语变量作为

Q(english_support=english)

但是没有成功。如果我打印出结果,如果没有检查,它返回None,如果检查,返回on。我如何添加条件,如果None,根据其他Q参数返回所有结果,如果True,只需将其添加到其他条件?

gab6jxml

gab6jxml1#

您可以链接多个.filter()方法,因此仅当相应的表单字段为True(=其值为on,这是复选框的默认值)时才应用新的布尔过滤器。

if request.htmx:
    name = request.GET.get('name')
    city = request.GET.get('city')
    ward = request.GET.get('ward')
    speciality = request.GET.get('speciality')

    if all([len(name) == 0, len(city) == 0, len(ward) == 0, len(speciality) == 0]):
        qs = None
    else:
        qs = Clinic.objects.filter(Q(name__icontains=name) &
                                   Q(city__icontains=city) &
                                   Q(ward__icontains=ward) &
                                   Q(speciality__icontains=speciality))

        if request.GET.get('english') == 'on':
            qs = qs.filter(english_support=True)

相关问题