from django.conf import settings from django.contrib.postgres.fields.hstore import KeyTransform from django.contrib.postgres.lookups import (SearchLookup, TrigramSimilar, Unaccent) from django.db.models.expressions import Col from django.db.models.lookups import (Contains, EndsWith, Exact, IContains, IEndsWith, IExact, In, IRegex, IsNull, IStartsWith, Regex, StartsWith) from django.utils import translation class LocalizedLookupMixin(): def process_lhs(self, qn, connection): if isinstance(self.lhs, Col): language = translation.get_language() or settings.LANGUAGE_CODE self.lhs = KeyTransform(language, self.lhs) return super().process_lhs(qn, connection) def get_prep_lookup(self): return str(self.rhs) class LocalizedSearchLookup(LocalizedLookupMixin, SearchLookup): pass class LocalizedUnaccent(LocalizedLookupMixin, Unaccent): pass class LocalizedTrigramSimilair(LocalizedLookupMixin, TrigramSimilar): pass class LocalizedExact(LocalizedLookupMixin, Exact): pass class LocalizedIExact(LocalizedLookupMixin, IExact): pass class LocalizedIn(LocalizedLookupMixin, In): pass class LocalizedContains(LocalizedLookupMixin, Contains): pass class LocalizedIContains(LocalizedLookupMixin, IContains): pass class LocalizedStartsWith(LocalizedLookupMixin, StartsWith): pass class LocalizedIStartsWith(LocalizedLookupMixin, IStartsWith): pass class LocalizedEndsWith(LocalizedLookupMixin, EndsWith): pass class LocalizedIEndsWith(LocalizedLookupMixin, IEndsWith): pass class LocalizedIsNullWith(LocalizedLookupMixin, IsNull): pass class LocalizedRegexWith(LocalizedLookupMixin, Regex): pass class LocalizedIRegexWith(LocalizedLookupMixin, IRegex): pass