Django - Как добавить условие "или" к queryset.filter в пользовательском фильтре

Я хочу сделать фильтр поиска, который ищет в нескольких полях с несколькими условиями, используя только одно поле поиска. У меня есть такой файл filters.py:

import django_filters
from .models import Product


class ProductFilter(django_filters.FilterSet):
    q = django_filters.CharFilter(method='search_filter', label='Cerca')

    class Meta:
        model = Product
        fields = ['q']

    def search_filter(self, queryset, name, value):
        return queryset.filter(name__icontains=value, sku__iexact=value)

но return queryset.filter(name__icontains=value, sku__iexact=value) не работает, как и return queryset.filter(Product(name__icontains=value) | Product(sku__iexact=value)). Как я могу это сделать?

Вы можете фильтровать с помощью Q объектов [Django-doc]:

import django_filters
from django.db.models import Q
from .models import Product

class ProductFilter(django_filters.FilterSet):
    q = django_filters.CharFilter(method='search_filter', label='Cerca')

    class Meta:
        model = Product
        fields = ['q']

    def search_filter(self, queryset, name, value):
        return queryset.filter(Q(name__icontains=value) | Q(sku__iexact=value))

Без Q(), вы также можете запустить ORоператор , как показано ниже:

import django_filters
from .models import Product

class ProductFilter(django_filters.FilterSet):
    q = django_filters.CharFilter(method='search_filter', label='Cerca')

    class Meta:
        model = Product
        fields = ['q']

    def search_filter(self, queryset, name, value): # Here
        return queryset.filter(name__icontains=value) | \
               queryset.filter(sku__iexact=value)
Вернуться на верх