针对搜索参数的过滤器django rest框架

问题描述:

如何搜索get queryset如果搜索参数为空或不是,所以我可以进一步自定义我的搜索,我希望它不过滤queryset“today”,如果搜索是不是空的,有人可以解释我该怎么做?针对搜索参数的过滤器django rest框架

ModelViewSet:

from rest_framework import viewsets, permissions, filters  
from cms.restapi.pagination import StandardResultsOffsetPagination 
from cms_sales.models import LeadContact 
from cms_sales.restapi.permissions.lead_contact_permissions import LeadContactPermissions 
from cms_sales.restapi.serializers.lead_contact_serializer import LeadContactSerializer 


class LeadContactViewSet(viewsets.ModelViewSet): 
    def get_queryset(self): 
     queryset = LeadContact.objects.none() 
     user = self.request.user 
     if user.has_perm('vinclucms_sales.can_view_full_lead_contact_list'): 
      queryset = LeadContact.objects.all() 
     elif user.has_perm('vinclucms_sales.can_view_lead_contact'): 
      queryset = LeadContact.objects.filter(account_handler=user) 

     filter_date = self.request.query_params.get('filter_date', None) 

     if filter_date is not None: 
      queryset = queryset.filter(next_action_date=filter_date) 

     return queryset 

    serializer_class = LeadContactSerializer 

    filter_backends = (filters.DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter) 

    filter_fields = ('account_handler',) 

    ordering_fields = (
     'first_name', 'last_name', 'account_handler__first_name', 'account_handler__last_name', 
     'sub_organization_name', 'organization_name', 'next_action_date', 'serial_number', 
     'status_text') 

    search_fields = (
     'first_name', 'last_name', 'account_handler__first_name', 'account_handler__last_name', 
     'sub_organization_name', 'organization_name', 'next_action_date', 'serial_number', 
     'status_text') 

    pagination_class = StandardResultsOffsetPagination 

    permission_classes = [permissions.IsAuthenticated, LeadContactPermissions] 
+0

也许我误解你的问题,但'query_params'应该只是一个'dict'所以如果它不是空的,然后添加您的“今天”过滤器。 – themanatuf

+0

是的,谢谢你的提示,我有点困惑 – PetarP

之后,我跟我的朋友,我们想出了一个解决我的问题,所以我增加了对寻找新的query_params,我们增加了一个条款的if声明我已经准备好使用了。

附加条款是检查是否对搜索请求的query_params /过滤可用且不是空的,所以如果是这样的话,我们不会在今天部件添加到queryset,从而使搜索执行整个queryset

的解决方案是:

filter_date = self.request.query_params.get('filter_date', None) 
search_params = self.request.query_params.get('search', None) 

if filter_date is not None and (search_params is None or len(search_params) == 0): 
    queryset = queryset.filter(next_action_date=filter_date) 

return queryset