django-filter仅支持完整名称匹配,如何实现部分匹配查询?
实现django-filter的部分匹配查询
当前你的django-filter配置是完全匹配逻辑,要改成部分匹配,只需要调整CharFilter的lookup_expr参数,使用Django ORM支持的部分匹配查询表达式即可。
修改后的ProjectFilter代码:
import django_filters from .models import Project class ProjectFilter(django_filters.FilterSet): # 调整lookup_expr为icontains(不区分大小写的部分匹配),同时修正field_name为正确的关联字段路径 address__name = django_filters.CharFilter(field_name='address__name', lookup_expr='icontains') approve = django_filters.BooleanFilter(field_name='approve') ordering = django_filters.OrderingFilter(choices=CHOICES, required=True, empty_label=None,) class Meta: model = Project exclude = [field.name for field in Project._meta.fields] order_by_field = 'address'
关键说明:
- lookup_expr参数选择:
icontains:不区分大小写的部分匹配,输入"Titan"会匹配包含该字符串的所有结果(如"Titanic"、"titan park")contains:区分大小写的部分匹配,只会匹配大小写完全符合的结果(如输入"Titan"只会匹配"Titanic",不会匹配"titanic")- 若需要前缀匹配(输入"Titan"匹配以它开头的结果),可使用
istartswith(不区分大小写)或startswith(区分大小写)
- field_name修正:原代码中
field_name='address'不符合关联字段的查询路径,若要筛选关联模型Address的name字段,需写成address__name,才能正确关联到目标字段。
视图代码无需修改:
class FilterTable(SingleTableMixin, FilterView): table_class = TableAll model = Project template_name = "table.html" filterset_class = ProjectFilter
修改完成后,输入部分关键词就能匹配到对应的结果。
内容的提问来源于stack exchange,提问作者nikar
相关产品推荐
相关产品推荐

