Фильтрация по параметрам запроса в отношениях "многие ко многим" с помощью 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

Вернуться на верх