2017-05-08 108 views
1

如何搜索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

回答

0

之後,我跟我的朋友,我們想出了一個解決我的問題,所以我增加了對尋找新的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