Создание пользовательских полей с помощью 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
Надеюсь, это может помочь.