我在我的模型中添加了标签= taggablemanager(black = true),但我希望我的标签对案例不敏感。我看到了一些工作片段,并想问一下是否有一种简单的方法?如果我必须从taggablemanager中覆盖一些方法,请告知我该怎么做?

预先感谢Arshavski Alexander。

有帮助吗?

解决方案

我用过 这个片段 对于类似的问题。代码的副本(为后代转载):

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>

基本上,您覆盖了初始的QuerySet,以便所有QuerySet都考虑到不敏感的情况。

其他提示

我确定您现在已经找到了解决方案:)虽然我会放这个答案,因为有人在搜索时可能会遇到这个问题 -

利用 https://github.com/shacker/django-taggit Django-Taggit的版本。

它允许配置taggit_force_lowercase = true

它还允许您过滤停止单词。

Django-Taggit的最新版本支持 TAGGIT_CASE_INSENSITIVE 设置,这应该以您描述的方式行事。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top