Фильтрация по параметрам запроса в отношениях "многие ко многим" с помощью drf
У меня есть две модели:
class Book(models.Model):
id = models.CharField(verbose_name="unique id", primary_key=True, max_length=256)
title = models.CharField(max_length=256)
published_date = models.CharField(max_length=128, blank=True, null=True)
average_rating = models.IntegerField(blank=True, null=True, default=None)
ratings_count = models.IntegerField(blank=True, null=True, default=None)
thumbnail = models.URLField(verbose_name="thumbnail url", null=True, blank=True, default=None)
class Author(models.Model):
name = models.CharField(null=True, blank=True, max_length=256)
books = models.ManyToManyField(Book, related_name='authors')
Я хочу добиться того, чтобы фильтровать запросы api с помощью параметров запроса следующим образом:
127.0.0.1/books?author='something'
Так что мой параметр - это что-то в этом случае.
Я хочу фильтровать по именам авторов и проверять, есть ли книги, которые имеют отношение к этим авторам. Также важно, чтобы одновременно могло быть более одного параметра, например, так:
?author='something1'&author='something2'
Я понятия не имею, как этого добиться. Я пытаюсь использовать фильтрацию по умолчанию, используя функцию get_queryset в общих классах DRF, но все еще не имею представления.
Это легко сделать с помощью DjangoFilterBackend.
Вы можете попробовать и следовать шагам здесь
в разделе "Общая фильтрация".
Если это не работает - вы можете попробовать сторонний пакет, например django-filters
:) Дайте мне знать, как это происходит :)
Правильный способ - использовать django-filter: https://django-filter.readthedocs.io/en/stable/guide/install.html
Нравится:
class BookFilterSet(filters.FilterSet):
class Meta:
model = Book
fields = ['authors']
class BookViewSet(ModelViewSet):
serializer_class = BookSerializer
queryset = Book.objects.all()
filter_backends = [filters.DjangoFilterBackend]
filterset_class = BookFilterSet
Хорошо, в основном я использовал пакет django-filters, как вы мне посоветовали, но я не знаю, как добиться эффекта фильтрации несколько раз по одному и тому же ключу запроса.
Я имею в виду, что если кто-то попытается отфильтровать по нескольким именам авторов, например, так:
?author=tolkien&author=jan
Тогда как я могу отфильтровать базу данных по этим двум значениям "tolkien" и "jan"?
Мой набор фильтров выглядит следующим образом:
class BookFilter(filters.FilterSet):
author = filters.CharFilter(field_name='authors__name' ,lookup_expr='icontains')
categories__name = filters.CharFilter(lookup_expr='icontains')
published_date = filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Book
fields = ['author', 'categories__name', 'published_date']
А функция просмотра выглядит следующим образом:
class BooksView(generics.ListAPIView):
queryset = Book.objects.all()
serializer_class = BooksSerializer
filter_backends = [filters.DjangoFilterBackend,]
filterset_class = BookFilter
По сути, я хочу получить набор запросов с книгами, авторы которых содержат имена jan, или tolkien