【发布时间】:2023-03-05 13:52:01
【问题描述】:
我在模型中添加了 tags = TaggableManager(blank=True),但我希望我的标签不区分大小写。 我看到了一些解决此问题的 sn-ps 并想问是否有一种简单的方法可以做到这一点? 如果我必须覆盖 TaggableManager 中的某些方法,请告知我该怎么做?
提前致谢, 阿尔沙夫斯基亚历山大。
【问题讨论】:
标签: django django-taggit
我在模型中添加了 tags = TaggableManager(blank=True),但我希望我的标签不区分大小写。 我看到了一些解决此问题的 sn-ps 并想问是否有一种简单的方法可以做到这一点? 如果我必须覆盖 TaggableManager 中的某些方法,请告知我该怎么做?
提前致谢, 阿尔沙夫斯基亚历山大。
【问题讨论】:
标签: django django-taggit
我曾使用this snippet 解决类似问题。代码副本(后人转载):
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>
基本上,您会覆盖初始查询集,以便所有查询集都考虑不区分大小写。
【讨论】:
我相信你现在已经找到了解决方案 :) 虽然我会给出答案,因为有人可能会在搜索时遇到这个问题 -
使用https://github.com/shacker/django-taggit 版本的django-taggit。
它允许配置 TAGGIT_FORCE_LOWERCASE = True
它还允许您过滤停用词。
【讨论】:
settings.py 还是models.py?
settings.py
最新版本的 django-taggit 支持 TAGGIT_CASE_INSENSITIVE 设置,它的行为应该与您描述的方式相同。
【讨论】:
settings.py 还是models.py?
根据211行的_TaggableManager
case_insensitive = getattr(settings, "TAGGIT_CASE_INSENSITIVE", False)
我们需要在settings.py中添加这个参数
【讨论】: