Можно ли фильтровать поля, определенные в django.contrib.postgres.fields
например ArrayField
?
В настоящее время django-filter не имеет фильтров, совместимых с полями contrib postgres - вам нужно будет создать свои собственные. Это будет более или менее сложно, в зависимости от того, что вы пытаетесь сделать. Поддержка пользовательского поиска для ArrayField
была бы довольно тривиальной:
class CharArrayFilter(filters.BaseCSVFilter, filters.CharFilter):
pass
class MyFilterSet(filters.FilterSet):
tags__contains = CharArrayFilter(name='tags', lookup_expr='contains')
class Meta:
model = SomethingTaggable
GET http://localhost/api/something-taggable?tags__contains=a,b,c
Вышеупомянутый фильтр проверяет входные данные, разделенные запятыми, и возвращает список очищенных значений, который подходит для базового вызова .filter()
.
С другой стороны, немного сложнее обрабатывать преобразования индекса и среза, которые неструктурированы и имеют теоретически бесконечное количество комбинаций.
Спасибо за информацию.
На данный момент я собираюсь закрыть это как Вне области действия. Мы рады рассмотреть задокументированные, проверенные запросы на вытягивание. Возможно, в будущем мы сможем пересмотреть свое мнение.
Обновлять:
Параметр name
был переименован в field_name
поэтому MyFilterSet
должен выглядеть так:
class MyFilterSet(filters.FilterSet):
tags__contains = CharArrayFilter(field_name='tags', lookup_expr='contains')
class Meta:
model = SomethingTaggable
Самый полезный комментарий
В настоящее время django-filter не имеет фильтров, совместимых с полями contrib postgres - вам нужно будет создать свои собственные. Это будет более или менее сложно, в зависимости от того, что вы пытаетесь сделать. Поддержка пользовательского поиска для
ArrayField
была бы довольно тривиальной:Вышеупомянутый фильтр проверяет входные данные, разделенные запятыми, и возвращает список очищенных значений, который подходит для базового вызова
.filter()
.С другой стороны, немного сложнее обрабатывать преобразования индекса и среза, которые неструктурированы и имеют теоретически бесконечное количество комбинаций.