Django现场多个过滤器

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

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

我在做一个简单的过滤器-

在过滤器.py在

class TblserversFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(name="servername", lookup_type="exact")

    class Meta:
        model = Tblservers
        fields = ['servername']

如果可能的话,我想做的是让两个查找类型与字段关联。具体来说,我需要exact和{},然后根据过滤器的不同,以某种方式替换操作符。在

name=serverabc将是精确搜索,name~abc将是模糊搜索。在


Tags: djangonamepy过滤器modeltypelookupfilters
2条回答

您可以做一个method_filter,然后用不同的符号为过滤器查询添加前缀,以便在客户端使用精确的和icontains以及其他过滤器。在

既然代码胜过千言万语:

exact_prefix = '#'
icontains_prefix = '~'


class TblserversFilter(django_filters.FilterSet):
    name = django_filters.MethodFilter(
            action=name_filter)

    def name_filter(self, value):
        if value:
            value_prefix = value[0]

            if value_prefix == exact_prefix:
                return self.filter(name=value)

            elif value_prefix == icontains_prefix:
                return self.filter(name__icontains=value)

            # this can continue for all the types of filters you want
            else:
                return self.filter(name=value)
        else:
            return self.filter(name=value)

    class Meta:
        model = Tblservers
       fields = ['servername']

编辑:

在django过滤器1.0MethodFilterwas replaced with ^{}'s ^{} argument中。因此,为v1.0重写的解决方案如下(未测试):

^{pr2}$

首先,我为无耻的图书馆自行插拔道歉。在

在某种程度上,我试图在django过滤器中做一些类似的事情,但是解决方案比预期的要复杂得多。最后,我创建了自己的库来用Django进行过滤,它本机支持您正在寻找的功能-django-url-filter。其API与django过滤器非常相似:

from django import forms
from url_filter.filter import Filter
from url_filter.filtersets import ModelFilterSet

class TblserversFilter(FilterSet):
    name = Filter(form_field=forms.CharField(max_length=15), lookups=['exact', 'contains'])

    class Meta(object):
        model = Tblservers
        fields = ['name', 'servername']

请注意,URL看起来有点不同:

^{pr2}$

此外,您还需要手动调用筛选器集以筛选查询集:

fs = TblserversFilter(data=query, queryset=...)
filtered_qs = fs.filter()

URL参数的语法与Django-ORM非常相似。 您可以查看文档以获取更多示例。希望它能有用。在

相关问题 更多 >