DoggieMurr
@DoggieMurr
Python Enthusiast

Как фильтровать в django?

Понадобилось написать фильтры для 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]
  • Вопрос задан
  • 129 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы