Django-filter,如何进行多字段搜索?(使用Django-filter!)

yacmzcpb  于 2022-12-14  发布在  Go
关注(0)|答案(4)|浏览(202)

我如何使用Django-filter从模型中搜索多个字段,比如:

class Location(models.Model):
    loc = models.CharField(max_length=100, blank=True)
    loc_mansioned = models.CharField(max_length=100, blank=True)
    loc_country = models.CharField(max_length=100, blank=True)
    loc_modern = models.CharField(max_length=100, blank=True)

我需要在我的网站上的一个输入字段,可以搜索位置模型的所有字段

niwlg2el

niwlg2el1#

您可以创建一个自定义过滤器,并执行如下操作:

from django.db.models import Q
import django_filters

class LocationFilter(django_filters.FilterSet):
    q = django_filters.CharFilter(method='my_custom_filter', label="Search")

    class Meta:
        model = Location
        fields = ['q']

    def my_custom_filter(self, queryset, name, value):
        return queryset.filter(
            Q(loc__icontains=value) | Q(loc_mansioned__icontains=value) | Q(loc_country__icontains=value) | Q(loc_modern__icontains=value)
        )

这将按这些字段中的任何一个进行过滤。您可以用任何您想要的替换icontains

9jyewag0

9jyewag02#

这是完美的。我正在尝试做一个动态过滤器,如果选中一个开关,在搜索中获得多一个字段。类似这样:

def my_custom_filter(self, queryset, name, value):
    return Reference.objects.filter(
        Q(ref_title__icontains=value))

def my_custom_filter_with_description(self, queryset, name, value):
    return Reference.objects.filter(
        Q(ref_title__icontains=value) | Q(complete_description__icontains=value))

但我不知道如何将开关与类关联起来

nnvyjq4y

nnvyjq4y3#

由于您已经将Location定义为一个对象,因此要按多个字段进行过滤,只需使用filter方法。

filterlocation = Location.objects.filter(loc=formloc, loc_mansioned=formlocmansioned, loc_country=formloccountry, loc_modern=formlocmodern)

但是您需要实现一种更好的方法来使用这个过滤器,这样只有满足所有条件的结果才会显示出来。

bvjveswy

bvjveswy4#

另一个解决方案,因为另一个不直接工作:

@staticmethod
def filter_stock(qs, name, value):
    return qs.filter(
        Q(ticker__exact=value) | Q(company__iexact=value)
    )

相关问题