1

views.pyкак использовать Джанго остальные фильтрации с 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 

Это мой код.

Это работа для фильтрации именно того, что мы хотим serach.

, например: 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 в ваших запросов ... Params

Но если вы хотите, чтобы продолжить свой подход, я хотел бы добавить логику в методе 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 вопросов получите правильный ответ. –