Создание пользовательских полей с помощью django-filters

У меня есть модель, как показано ниже. Модель имеет атрибут type в качестве внешнего ключа.

class YachtGeneralInfo(models.Model):
    type = models.ForeignKey(
        YachtTypes,
        related_name="yachts_in_type",
        on_delete=models.PROTECT,
        blank=False,
        null=False,
    )
    ....
    ....

Я написал класс представления следующим образом -

class YachtGeneralInfoView(ListAPIView):

    pagination_class = PageNumberPagination
    serializer_class = YachtGeneralInfoSerializer
    filter_backends = [OrderingFilter, SearchFilter, DjangoFilterBackend]
    filterset_fields = [
        "status",
        "is_professional",
        "chartered_with__id",
        "harbour__id",
        "harbour__city__id",
        "model__id",
    ]
    search_fields = ["name", "company_name", "website", "owner__name"]

Я хочу добавить еще один фильтр для поля type. Однако я хочу предоставить несколько значений для этого параметра запроса, например [1,2,3].

Если я сделаю это непосредственно с помощью queryset, то это будет выглядеть так -

queryset = YachtGeneralInfo.objects.filter(type__in=[1,2,3])

Есть ли способ написать пользовательское поле набора фильтров для достижения этого вместо того, чтобы располагать его непосредственно в наборе запросов?

Вы можете создать свой собственный набор фильтров для поиска идентификатора типа.

class YachtTypeFilterSet(django_filters.FilterSet):
    type_in = django_filters.CharFilter(
        method='filter_guest_level', field_name='guest_level')

    def filter_type_in(self, queryset, field_name, value):
        if value != "":
            id_array = json.loads(value)
            if isinstance(id_array, list):
                return queryset.filter(type__id__in=id_array)
        return queryset

Затем вы можете установить этот класс в представлении.

class YachtGeneralInfoView(ListAPIView):
    ...
    filterset_class = YachtTypeFilterSet

Надеюсь, это может помочь.

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