星で行くと、 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」で結果を返す必要があります)。
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
から抽出されます。
最も参考になるコメント
最新のライブラリを使用した実例: