Понадобилось написать фильтры для queryset`a.
Прочитал как это делать, пришел к такому результату, но ничего не работает.
Пример запроса: api/v1/allOrders/?city=London - в ответ оно отдает просто весь queryset без применения фильтров
class CharFilterInFilter(django_filters.BaseInFilter, django_filters.CharFilter):
pass
class OrderFilter(django_filters.FilterSet):
city = CharFilterInFilter(field_name='city__name', lookup_expr='in')
inventory = CharFilterInFilter(field_name='inventories__name', lookup_expr='in')
specialization = CharFilterInFilter(field_name='specializations__name', lookup_expr='in')
country = CharFilterInFilter(field_name='country__name', lookup_expr='in')
region = CharFilterInFilter(field_name='region__name', lookup_expr='in')
budget = django_filters.RangeFilter()
status = django_filters.ChoiceFilter(field_name='status', choices=StatusChoices.choices)
class Meta:
model = OrderModel
fields = ('city', 'inventory', 'specialization', 'country', 'region', 'budget')
Это модель
class OrderModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
number = models.BigIntegerField('Номер заказа', default=gen_order_num)
title = models.CharField('Заголовок', max_length=512)
description = models.TextField('Описание')
created_at = models.DateTimeField('Время создания', auto_now_add=True)
updated_at = models.DateTimeField('Время последнего обновления', auto_now=True)
longitude = models.FloatField('Долгота', default=0)
latitude = models.FloatField('Широта', default=0)
client = models.ForeignKey(
verbose_name='Заказчик',
to=User,
related_name='orders',
on_delete=models.CASCADE,
null=True
)
specializations = models.ManyToManyField(
verbose_name='Специализации',
to=BaseSpecializationModel,
related_name='orders',
null=True,
blank=True
)
budget = models.FloatField('Бюджет', null=True, blank=True)
start_date = models.DateField('Дата когда нужно приступить', null=True, blank=True)
end_date = models.DateField('Дата когда нужно закончить', null=True, blank=True)
tags = models.ManyToManyField(
verbose_name='Теги',
to='TagModel',
related_name='orders',
null=True,
blank=True
)
comment = models.TextField('Комментарий к заказу', null=True, blank=True, default='')
files = models.ManyToManyField(
verbose_name='Файлы к заказу',
to='FileModel',
related_name='orders',
null=True,
blank=True
)
status = models.CharField(
max_length=99,
choices=StatusChoices.choices,
default=StatusChoices.ON_MODERATION
)
responses = models.ManyToManyField(
verbose_name='Отклики',
to='ResponseModel',
related_name='orders',
null=True,
blank=True
)
executor = models.ForeignKey(
verbose_name='Исполнитель',
to=FactoryModel,
related_name='orders',
on_delete=models.SET_NULL,
null=True,
blank=True
)
associated_factory = models.ForeignKey(
verbose_name='Связанная фабрика',
to=FactoryModel,
related_name='associated_orders',
on_delete=models.SET_NULL,
null=True,
blank=True
)
city = models.ForeignKey(
verbose_name='Город',
to=CityModel,
related_name='orders',
on_delete=models.SET_NULL,
null=True,
blank=True
)
region = models.ForeignKey(
verbose_name='Регион',
to=RegionModel,
related_name='orders',
on_delete=models.SET_NULL,
null=True,
blank=True
)
country = models.ForeignKey(
verbose_name='Страна',
to=CountryModel,
related_name='orders',
on_delete=models.SET_NULL,
null=True,
blank=True
)
inventories = models.ManyToManyField(
verbose_name='Оборудование',
to=FactoryInventoryModel,
related_name='orders',
related_query_name='order',
null=True,
blank=True
)
is_provide_materials = models.BooleanField(
verbose_name='Сырье и материалы заказчика',
null=True,
blank=True,
default=False
)
quantity = models.IntegerField('Количество', null=True, blank=True, default=1)
street = models.CharField('Улица', max_length=255, null=True, blank=True)
house = models.CharField('Дом', max_length=255, null=True, blank=True)
office = models.CharField('Офис', max_length=255, null=True, blank=True)
И сам viewset
class OrderViewSet(viewsets.ModelViewSet):
serializer_class = serializers.OrderSerializer
permission_classes = (drf_permissions.IsAuthenticatedOrReadOnly,)
queryset = models.OrderModel.objects.all()
filterset_class = OrderFilter
filter_backends = [DjangoFilterBackend]