Django-filter: 过滤 Django-Taggit(请求)

创建于 2016-08-16  ·  11评论  ·  资料来源: carltongibson/django-filter

按星级来看差不多,我相信它是 Django 中标记

您如何看待 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 添加特定的过滤器,尽管它可能是一个很棒的包。

最终创建项目级过滤器并不难。 一个体面的要点会有很长的路要走。 (谷歌非常适合那些人。)

如果出现 A+ 拉取请求,很高兴看到它,但除此之外,我将关闭它,因为它超出了范围。

好,可以。 对ModelMultipleChoiceFilter lookup_expr支持怎么样?

@stantond 很高兴看到 PR。 _给我看 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

使用标签的slug字段而不是name字段不区分大小写。 默认情况下,Taggit 将 slugs 小写。

请注意,如果我们希望支持通过包含一个或多个空格的单个标签进行过滤,我们可以使用自定义字段扩展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 等级