0

Я использую django-taggit для tags, так что это по существу только отношение m2m.django-filters BaseInFilter с CharFilter не возвращает результатов при пустых с django-rest-framework

Следующее позволяет мне фильтровать теги с разделенной запятой строкой.

Однако API-интерфейс, доступный для просмотра, с django-rest-framework представляет параметры фильтра, и &tags= без соответствующих значений фильтрует ВСЕ результаты. Я сделал что-то неправильно ниже? Или это проблема с API-интерфейсом?

class TagsFilter(django_filters.filters.BaseInFilter, django_filters.filters.CharFilter): 
    pass 

class NuggetFilter(filters.FilterSet): 
    tags = TagsFilter(name="tags__name", distinct=True) 

ответ

1

Это ошибка в DJANGO-фильтра (pull request). Виджет CSV анализирует пустое значение как список, содержащий одну пустую строку, [''] вместо пустого списка. Значение не является технически пустым, поэтому она проходит проверку на пустой фильтр, в результате чего в следующем запросе:

Nugget.objects.filter(tags__name__in=['']) 

Чтобы обойти это в краткосрочной перспективе, вы можете переопределить метод фильтра следующим образом:

class TagsFilter(django_filters.filters.BaseInFilter, django_filters.filters.CharFilter): 

    def filter(self, qs, value): 
     if value == ['']: 
      return qs 
     return super(TagsFilter, self).filter(qs, value)