Фильтрация поля «многие ко многим» DRF

Мне нужно отфильтровать мой ответ API документа, используя поле категории «многие ко многим». Это моя модель:

class Document(models.Model):
    name = models.CharField(max_length = 100, blank = True)
    file = models.FileField(null = True, upload_to='documents/', validators=[FileExtensionValidator(allowed_extensions=['pdf'])])
    date_created = models.DateTimeField(auto_now_add = True, null = True)
    category = models.ManyToManyField(Category)
    company = models.ForeignKey(Company, null = True, on_delete = models.SET_NULL)
    author = models.ForeignKey(Employee, null = True, on_delete = models.SET_NULL)

Сериализатор для этих моделей:

class DocumentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Document
        fields = "__all__"

И я пытаюсь отфильтровать это с помощью этого:

class DocumentFilter(filters.FilterSet):
    # having_category = filters.Filter(name = 'category', lookup_type = 'in')
    class Meta:
        model = Document
        fields = {
            'company': ['exact'],
            'author': ['exact'],
            # 'category': ['in']
        }

Я пытался использовать это решение, как вы можете видеть в коде, но безуспешно. фильтрация по компании и автору работает, а у меня проблема только с категорией.

Как мне создать фильтр?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
638
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете обратиться отсюда https://django-filter.readthedocs.io/en/stable/ref/filters.html

import django_filters

class DocumentFilter(django_filters.FilterSet):
    company = django_filters.CharFilter(lookup_expr = "exact", field_name='company__name')
    author = django_filters.CharFilter(lookup_expr = "exact", field_name='author__name')
    category = django_filters.CharFilter(method='filter_category')

    class Meta:
        model = Document
        fields = ['company', 'author', 'category']

    def filter_category(self, queryset, name, value):
        categories = value.split(',')
        return queryset.filter(category__name__in=categories)

Рад помочь

Krishna Singhal 15.12.2020 09:18

см. здесь

import django_filters as filters

class CharInFilter(filters.BaseInFilter, filters.CharFilter):
    pass

class DocumentFilter(filters.FilterSet):
    category_in = CharInFilter(field_name='category__name', lookup_expr='in', distinct=True)

    class Meta:
        model = Document
        fields = {
            'company': ['iexact'],
            'author': ['iexact'],
         }

Другие вопросы по теме