0

私はをtagsに使用しています。django-filters CharFilterのBaseInFilterは、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-filter(pull request)のバグです。 CSVウィジェットは、空のリストの代わりに空の文字列が1つ含まれるリストとして空の値を解析しています([''])。値が技術的に空ではないので、それは次のクエリで、その結果、フィルタの空のチェックをパス:

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) 
関連する問題