1

views.py如何使用Django的休息與mongoengine用於過濾列表過濾

from __future__ import unicode_literals 

from rest_framework_mongoengine.viewsets import ModelViewSet as MongoModelViewSet 

from app.serializers import * 

from rest_framework_mongoengine.generics import * 

from rest_framework import filters  


def index_view(request): 
    context = {} 
    return TemplateResponse(request, 'index.html', context) 


class ToolViewSet(MongoModelViewSet): 
    serializer_class = ToolSerializer 
    my_filter_fields = ('crop', 'district','taluka','circle','year',) 

    def get_kwargs_for_filtering(self): 
     filtering_kwargs = {} 

     for field in self.my_filter_fields: # iterate over the filter fields 
      field_value = self.request.query_params.get(field) # get the value of a field from request query parameter 
      if field_value: 
       filtering_kwargs[field] = field_value 
     return filtering_kwargs 

    def get_queryset(self): 
     queryset = Tool.objects.all() 
     filtering_kwargs = self.get_kwargs_for_filtering() # get the fields with values for filtering 
     if filtering_kwargs: 
      queryset = Tool.objects.filter(**filtering_kwargs) # filter the queryset based on 'filtering_kwargs' 
     return queryset 

這是我的代碼。

它的工作原理是精確地篩選我們想要的東西。

例如:http://api/tool/?district=Nasik&crop=banana

但是,它不工作的列表的Fileds 例如:http://api/tool/?district=Nasik&district=Pune 這給了輸出:[](空)

如何獲得此過濾器的工作來獲取所有區「納西克」,區‘普納’

能否請你幫我,我不得不爲獲取數據在我的代碼的變化,如果我搜索http://api/tool/?crops=guava,banana 或http:../工具/區=納西克,浦那
給我正確的輸出?

回答

1

我推薦看看django-rest-framework-filters。然後,您可以使用這樣的東西在你的查詢參數__in ...

但是如果你想用你的方法來進行,我會在你的get_kwargs_for_filtering方法在某種程度上增加了邏輯是這樣的:

def get_kwargs_for_filtering(self): 
    filtering_kwargs = {} 

    for field in self.my_filter_fields: # iterate over the filter fields 
     field_value = self.request.query_params.get(field) # get the value of a field from request query parameter 
     if field_value: 
      if ',' in field_value: # put your queryParams into an array and use the built-in django filter method '__in' 
       filtering_kwargs[field + '__in'] = field_value.split(',') 
      else: 
       filtering_kwargs[field] = field_value 
    return filtering_kwargs 

有了這個,撥打http://api/tool/?crops=guava,banana的電話應產生所需的行爲。 我無法測試它現在是否有效,但是這應該引導您朝正確的方向發展。

+0

,你的意思是在我的領域= {'name':['exact','in','startswith']}我必須使用這個? –

+0

你可以請給我一些提示,它會幫助你 –

+0

真棒...非常感謝,這正是我想要的...... !!!搜索1000個問題後得到正確的答案。 –