【问题标题】:How to filter queryset with one lookup field on mutiple fields in django-filter如何在 django-filter 中的多个字段上使用一个查找字段过滤查询集
【发布时间】:2021-09-05 02:52:00
【问题描述】:

假设我有 2 个字段 ["id", "name"]
我想使用django-filter 过滤我的ModelViewSet 中的查询集。

这是我的自定义FilterSet

from django_filters import rest_framework as filters
from store.models import Partner


class PartnerFilter(filters.FilterSet):
    """ Custom Partner Filter Set """

    name = filters.CharFilter(field_name="name", lookup_expr="icontains")

    class Meta:
        model = Partner
        fields = ["id", "name"]  

这是我的ModelViewSet

class PartnerViewSet(ModelViewSet):
    """ Partner View Set """

    serializer_class = PartnerSerializer
    queryset = Partner.objects.select_related("user").all()
    permission_classes = [IsAuthenticated,]
    authentication_classes = [SessionAuthentication]
    filter_backends = [DjangoFilterBackend,]
    filterset_class = PartnerFilter

我需要的是只使用一个查询字符串来过滤查询集。我不希望我的网址像.../?id=&name=string

我想要这样的东西:
.../?search=search_value 如果它匹配任何id 然后它通过 id 获取对象,或者如果它匹配name 然后它通过姓名

如何在django-filter 中实现此功能?
有没有办法在不覆盖ModelViewSet 中的get_queryset 方法的情况下做到这一点?

【问题讨论】:

    标签: django django-rest-framework django-filter


    【解决方案1】:

    你不需要为此使用django-filter,你真正需要的是SearchFilter

    您的视图应如下所示:

    from rest_framework import filters
    
    
    class PartnerViewSet(ModelViewSet):
        """ Partner View Set """
    
        serializer_class = PartnerSerializer
        queryset = Partner.objects.select_related("user").all()
        permission_classes = [IsAuthenticated,]
        authentication_classes = [SessionAuthentication]
        filter_backends = [filters.SearchFilter]
        search_fields = ['id', 'name']  # add here any other field that you want to match your search
    

    添加后,您可以将端点与 .../?search=search_value 一起使用

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 2016-07-20
      • 2023-01-16
      • 1970-01-01
      • 2015-04-03
      • 2020-06-27
      • 1970-01-01
      • 2017-03-28
      • 2020-03-07
      相关资源
      最近更新 更多