7

我在模型中添加了 tags = TaggableManager(blank=True),但我希望我的标签不区分大小写。我看到了一些解决方法的片段,想问一下是否有一种简单的方法可以做到这一点?如果我必须覆盖 TaggableManager 中的某些方法,请告知我该怎么做?

在此先感谢 Arshavski Alexander。

4

4 回答 4

3

我相信你现在已经找到了解决方案:) 虽然我会给出答案,因为有人可能会在搜索时遇到这个问题 -

使用https://github.com/shacker/django-taggit版本的 django-taggit。

它允许配置 TAGGIT_FORCE_LOWERCASE = True

它还允许您过滤停用词。

于 2012-11-26T22:01:03.733 回答
1

最新版本的 django-taggit 支持一个TAGGIT_CASE_INSENSITIVE设置,它应该按照您描述的方式运行。

于 2016-02-04T21:38:10.867 回答
0

根据 _TaggableManager 在 211 行

case_insensitive = getattr(settings, "TAGGIT_CASE_INSENSITIVE", False)

我们需要在settings.py中添加这个参数

于 2020-11-07T21:08:16.933 回答
-2

我已将此代码段用于类似问题。代码副本(为后代重印):

from django.db.models import Manager
from django.db.models.query import QuerySet

class CaseInsensitiveQuerySet(QuerySet):
    def _filter_or_exclude(self, mapper, *args, **kwargs):
        # 'name' is a field in your Model whose lookups you want case-insensitive by default
        if 'name' in kwargs:
            kwargs['name__iexact'] = kwargs['name']
            del kwargs['name']
        return super(CaseInsensitiveQuerySet, self)._filter_or_exclude(mapper, *args, **kwargs)

# custom manager that overrides the initial query set
class TagManager(Manager):
    def get_query_set(self):
        return CaseInsensitiveQuerySet(self.model)

# and the model itself
class Tag(models.Model):
    name = models.CharField(maxlength=50, unique=True, db_index=True)

    objects = TagManager()

    def __str__(self):
        return self.name
# now...
>>> tag = Tag(name='test')
>>> tag.save()
>>> Tag.objects.get(name='TEST')
<Tag: test>

基本上,您覆盖初始查询集,以便所有查询集都考虑不区分大小写。

于 2011-06-20T09:30:35.633 回答