Мне нужно отфильтровать мой ответ 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']
}
Я пытался использовать это решение, как вы можете видеть в коде, но безуспешно. фильтрация по компании и автору работает, а у меня проблема только с категорией.
Как мне создать фильтр?
Вы можете обратиться отсюда 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)
см. здесь
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'],
}
Рад помочь