Как настроить фильтрацию по связанному полю ManyToMany с использованием django-filters?

Как настроить фильтрацию по категории для модели Book при использовании django-filters, чтобы получать записи только по указанной категории?
  • 18 марта 2024 г. 13:49
Ответы на вопрос 2
Для настройки фильтрации по связанному полю ManyToMany с использованием django-filters, вам нужно создать класс фильтра, который будет использовать метод `ModelMultipleChoiceFilter` для поля ManyToMany.

Пример:

```python
import django_filters
from .models import Book

class BookFilter(django_filters.FilterSet):
    category = django_filters.ModelMultipleChoiceFilter(field_name='category__name', to_field_name='name', queryset=Category.objects.all())

    class Meta:
        model = Book
        fields = ['category']
```

В данном примере, `category` - это поле ManyToMany, для которого мы настраиваем фильтрацию. Мы указываем `field_name='category__name'` чтобы фильтровать по названию категории.

Для настройки фильтрации по категории для модели Book при использовании django-filters, вам также нужно создать класс фильтра, который будет использовать метод `ModelChoiceFilter` для поля категории.

Пример:

```python
import django_filters
from .models import Book

class BookFilter(django_filters.FilterSet):
    category = django_filters.ModelChoiceFilter(field_name='category__name', to_field_name='name', queryset=Category.objects.all())

    class Meta:
        model = Book
        fields = ['category']
```

В данном примере, мы использовали `ModelChoiceFilter` для поля категории, чтобы получать записи только по указанной категории.
Я допустил, ошибку, неправильно делая запрос: 
http://127.0.0.1:8000/api/v1/books?categories=<Название категории>


Сработал запрос вида:
http://127.0.0.1:8000/api/v1/books?categories__title=<Название категории>


Может кому то поможет..
Похожие вопросы