【问题标题】:How to use same same django_filters.CharFilter field for two separate fields如何为两个单独的字段使用相同的 django_filters.CharFilter 字段
【发布时间】:2019-08-27 06:20:16
【问题描述】:
所以,基本上我有一个与 django-tables2 一起使用的 FilterSet。现在我需要使用一个 char 字段,它应该从模型中搜索两个单独的字段。
例如:
ip_addr = django_filters.CharFilter(lookup_expr='icontains')
virtual_ip = django_filters.CharFilter(lookup_expr='icontains')
上面是我当前的过滤器集。这两个都被渲染到模板中的两个单独的字段中。但我想在前端将它们组合成一个字段,在 ip_addr 或 virtual_ip 中查找。
谁能指出我正确的方向。
【问题讨论】:
标签:
django
python-3.x
django-filter
django-tables2
【解决方案1】:
您可以在自定义方法中使用 Q 对象创建复杂的查找,以过滤多个字段,如下所示:
from django.db.models import Q
# ..your other imports..
YouFilterSet(django_filters.FilterSet):
# ip_addr = django_filters.CharFilter(lookup_expr='icontains')
# virtual_ip = django_filters.CharFilter(lookup_expr='icontains')
my_lookup_field = django_filters.CharFilter(label='ip', method='my_lookup_method')
class Meta:
# ..your meta attributes..
def my_lookup_method(self, queryset, name, value):
return queryset.filter(Q(ip_addr__icontains=value)|Q(virtual_ip__icontains=value))
这将在您的 ip_addr 或 virtual_ip 字段中返回带有您的值的Queryset。有关更多信息,您可以查看文档 here 获取 Q 对象以及 here 和 here 获取过滤器中的自定义方法。