Django-filter: Django-Taggitのフィルター(リクエスト)

作成日 2016年08月16日  ·  11コメント  ·  ソース: carltongibson/django-filter

星で行くと、 django-taggit頼りになるソリューションだと思います。 2010年から存在しており、定期的に更新されており、定期的に寄稿者が何人かいます。

django-taggitフィルターについてどう思いますか?

私がこれに最も近いのは:

tags = django_filters.ModelMultipleChoiceFilter(
        name='tags__name',
        to_field_name='name',
        conjoined=True,
        distinct=True,
        queryset=Tag.objects.all(),
    )

ただし、大文字と小文字を区別しないようにすることはできません(タグ「TeSt」のフィルターは、タグ「test」で結果を返す必要があります)。

最も参考になるコメント

最新のライブラリを使用した実例:

from taggit.forms import TagField
from django_filters.views import FilterView

class TagFilter(django_filters.CharFilter):
    field_class = TagField

    def __init__(self, *args, **kwargs):
        kwargs.setdefault('lookup_expr', 'in')
        super().__init__(*args, **kwargs)


class MyFilter(django_filters.FilterSet):
    tags = TagFilter(field_name='tags__name')

    class Meta:
        model = MyModel

全てのコメント11件

TaggitFilterは通常のModelMultipleChoiceFilterどのように異なりますか?

また、フィールド名とルックアップを結合するだけで、ここにlookup_exprサポートを追加できると確信しています。

ModelMultipleChoiceFilter 、URLはfield_name=tag1&field_name=tag2である必要がありますが、タグの数が多く、URLが非常に長くなる可能性があります。 たとえば、共有できるURLには理想的ではありません。

タグは一連のルールを使用してdjango-taggitによって処理され、すべてのタグを含む単一の文字列を渡すことができます。

とにかく、 lookup_expr ModelMultipleChoiceFilterは間違いなく役に立ちます!

ざっと見てみると、TaggitのTagsFieldを使用できるはずです。 これにより、csv解析の動作が得られます。

class TagsFilter(CharFilter):
    field_class = taggit.forms.TagsField

    def __init__(self, *args, **kwargs):
        kwargs.setdefault('lookup_expr', 'in')


class MyFilterSet(FilterSet):
    tags = TagsFilter(name='tags__name')

    class Meta:
        model = MyModel
GET http://localhost/api/my-model?tags=a,b,c,d

ここでの注意点は、これはinルックアップを使用することです。これは、探している大文字と小文字を区別しないソリューションではありません。

私は多かれ少なかれ、Django Taggitに特定のフィルターを追加しないことを心がけていますが、それは素晴らしいパッケージです。

最終的に、プロジェクトレベルのフィルターを作成することはそれほど難しくありません。 まともな要点は長い道のりです。 (Googleはそれらに最適です。)

A +プルリクエストが見つかった場合は喜んで見ていきますが、それが足りない場合は、範囲外としてこれを閉じます。

OK、十分に公平です。 ModelMultipleChoiceFilterでのlookup_exprサポートはどうですか?

@stantondPRを見て幸せです。 _Cödzを見せてください_😀

できればいいのですが、残念ながら私は熟練した開発者ではありませんが、手探りのPMです。

+1

最新のライブラリを使用した実例:

from taggit.forms import TagField
from django_filters.views import FilterView

class TagFilter(django_filters.CharFilter):
    field_class = TagField

    def __init__(self, *args, **kwargs):
        kwargs.setdefault('lookup_expr', 'in')
        super().__init__(*args, **kwargs)


class MyFilter(django_filters.FilterSet):
    tags = TagFilter(field_name='tags__name')

    class Meta:
        model = MyModel

大文字と小文字を区別しないようにするには、 nameフィールドの代わりにタグのslugフィールドを使用します。 Taggitは、デフォルトでスラッグを小文字にします。

1つ以上の空白を含む単一のタグによるフィルターをサポートする場合は、 https: //github.com/carltongibson/django-filter/issues/460#issuecomment-507218839のソリューションをカスタムフィールドで拡張できることに注意して

from django import forms
from django.utils.translation import gettext as _

from taggit.utils import parse_tags


class TagField(forms.CharField):

    def clean(self, value):
        value = super().clean(value)

        if "," not in value and '"' not in value and value:
            return [value]

        try:
            return parse_tags(value)
        except ValueError:
            raise forms.ValidationError(
                _("Please provide a comma-separated list of tags.")
            )

コードはtaggit/forms.pyから抽出されます。

このページは役に立ちましたか?
0 / 5 - 0 評価