【问题标题】:Create OR filter with django_filters使用 django_filters 创建 OR 过滤器
【发布时间】:2015-04-26 09:28:58
【问题描述】:

我想在我的 django_filters 中创建一个 OR 过滤器。 除了我的产品名之外,所有过滤器都完美无缺。

我有一个搜索框,需要在 name_nl、name_en 和 name_fr 列中搜索产品名称。

如何使用 Django_filter 创建或过滤器?

class ProductFilter(django_filters.FilterSet):
status = django_filters.CharFilter(name='productvariant__status_id', lookup_type='exact')
productname = django_filters.CharFilter(name='name_nl', lookup_type='icontains')

class Meta:
    model = Product
    fields = {
        'productname': ['icontains'],
        'status': ['exact']
    }

【问题讨论】:

    标签: django filter django-queryset django-filter


    【解决方案1】:

    你可以这样做。

    import django_filters
    from django.db.models import Q
    
    from app.models import User
    
    class UserFilter(django_filters.FilterSet):
    
        q = django_filters.MethodFilter()
    
        class Meta:
            model = User
            fields = []
    
        def filter_q(self, queryset, value):
            return queryset.filter(
                Q(last_name__icontains=value) | Q(first_name__icontains=value) | Q(email__icontains=value)
            )
    

    然后制作一个通用视图。

    from django_filters.views import FilterView
    
    from .filters import UserFilter
    
    class AgentListView(ClassRequiredMixin, FilterView):
    
        filterset_class = UserFilter
    

    有关您的模板,请参阅http://django-filter.readthedocs.org/en/latest/usage.html#the-template

    【讨论】:

    【解决方案2】:

    从 1.x 版本开始,MethodFilter was removed。现在看起来像:

    import django_filters
    from django.db.models import Q
    
    from app.models import User
    
    class UserFilter(django_filters.FilterSet):
        q = filters.CharFilter(method='filter_q')
    
        def filter_q(self, qs, name, value):
            return qs.filter(
                Q(last_name__icontains=value) | Q(first_name__icontains=value) | Q(email__icontains=value)
            )
    
    
    

    为了风景

    from django_filters.views import FilterView
    
    from .filters import UserFilter
    
    class AgentListView(ClassRequiredMixin, FilterView):
    
        filterset_class = UserFilter
    

    请注意,如果您使用的是 DRF,那么 2.x 中的 filterset_class 在 1.x 中被命名为 filter_class

    from django_filters import rest_framework as filters
    
    class AgentListViewSet(viewsets.ModelViewSet):
        filter_backends = (filters.DjangoFilterBackend, )
        filter_class = UserFilter
    

    【讨论】:

      【解决方案3】:

      您可以使用Q() objects

      来自文档:

      Poll.objects.get(
          Q(question__startswith='Who'),
          Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
      )
      

      给出类似的东西:

      SELECT * from polls WHERE question LIKE 'Who%'
          AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
      

      【讨论】:

      猜你喜欢
      • 2023-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 2022-01-23
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多