Frage

Ich habe meinen Modellen Tags = TaggableManager (blank = true) hinzugefügt, aber ich möchte, dass meine Tags von Fall unempfindlich sind. Ich habe dafür ein paar Ausschnitte von Arbeiten gesehen und wollte uns fragen, ob es eine einfache Möglichkeit gibt, dies zu tun? Wenn ich einige Methoden vom TaggableManager überschreiben muss, raten Sie bitte, wie ich das tun kann.

Vielen Dank im Voraus, Arshavski Alexander.

War es hilfreich?

Lösung

Ich habe benutzt Dieser Snippet für ein ähnliches Problem. Eine Kopie des Codes (nachgedruckt für die Nachwelt):

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>

Grundsätzlich überschreiben Sie den ersten QuerySet, sodass alle QuerySets -Unempfindlichkeitsgründen eine Fallfestigkeit berücksichtigen.

Andere Tipps

Ich bin sicher, Sie haben inzwischen die Lösung herausgefunden :) Obwohl ich die Antwort geben werde, da jemand dies beim Suchen schlagen könnte -

Verwenden https://github.com/shacker/django-taggit Version von Django-Taggit.

Es ermöglicht die Konfiguration von Taggit_force_lowercase = true

Es ermöglicht Ihnen auch, Stoppwörter zu filtern.

Jüngste Versionen von Django-Taggit-Unterstützung a TAGGIT_CASE_INSENSITIVE Setzen, das sollte sich so verhalten, wie Sie beschreiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top