【问题标题】:make case-insensitive tags with django-taggit使用 django-taggit 制作不区分大小写的标签
【发布时间】:2023-03-05 13:52:01
【问题描述】:

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

提前致谢, 阿尔沙夫斯基亚历山大。

【问题讨论】:

    标签: django django-taggit


    【解决方案1】:

    我曾使用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>
    

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

    【讨论】:

    • 请不要多次发布完全相同的答案。如果问题是重复的,请将其标记为这样。
    • 这并不能真正回答问题。问题涉及 django-taggit。您的建议基本上是“编写自己的标记应用程序”。
    【解决方案2】:

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

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

    它允许配置 TAGGIT_FORCE_LOWERCASE = True

    它还允许您过滤停用词。

    【讨论】:

    • 这是进入settings.py 还是models.py
    • Rusl,它会进入你的settings.py
    【解决方案3】:

    最新版本的 django-taggit 支持 TAGGIT_CASE_INSENSITIVE 设置,它的行为应该与您描述的方式相同。

    【讨论】:

    • 这是进入settings.py 还是models.py
    • @rusl settings.py
    【解决方案4】:

    根据211行的_TaggableManager

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-22
      • 2022-01-23
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      相关资源
      最近更新 更多