Попытка создать общий поиск с использованием фильтров django для всех полей в данной модели - PullRequest
1 голос
/ 28 июня 2019

Итак, я создаю собственный фильтр для своей модели и хочу, чтобы все поля в этом фильтре не использовали «точные», а «содержали», но я не хочу вручную добавлять все поля.Я пытаюсь сделать что-то вроде этого:

from django_filters import FilterSet
from polls.models import Question, Choice
from django_filters import rest_framework

class ChoiceFilter(FilterSet):
    for field in Choice._meta.get_fields():

        field = rest_framework.CharFilter(lookup_expr='icontains')
    #question = rest_framework.CharFilter(lookup_expr='icontains') #this works want to generalize this

    class Meta:
        model = Choice
        fields = '__all__'

Итак, вторая строка работает, но мой цикл for не работает, и мой фильтр использует «точный» вместо «содержит»

1 Ответ

1 голос
/ 28 июня 2019

Вы можете создать собственный класс FilterSet, который переопределяет метод get_fields, чтобы изменить поиск с exact на icontains:

class CustomFilterSet(FilterSet):
    @classmethod
    def get_fields(cls):
        fields = super().get_fields()
        for name, lookups in fields.items():
            lookups[:] = ['icontains']
        return fields

Теперь вы просто делаете ChoiceFilter наследованным от этого класса:

class ChoiceFilter(CustomFilterSet):
    class Meta:
        model = Choice
        fields = '__all__'

Имейте в виду, что использование __all__ для полей считается опасным.

...