def as_sql(self, compiler, connection): language = translation.get_language() fallback_config = getattr(settings, "LOCALIZED_FIELDS_FALLBACKS", {}) target_languages = fallback_config.get(language, []) if not target_languages and language != settings.LANGUAGE_CODE: target_languages.append(settings.LANGUAGE_CODE) if language: target_languages.insert(0, language) if len(target_languages) > 1: return Coalesce(*[ NullIf(KeyTransform(language, self.lhs), Value("")) for language in target_languages ]).as_sql(compiler, connection) return KeyTransform(target_languages[0], self.lhs).as_sql(compiler, connection)
def _build_search_expression(self, field_lookup): # TODO: is there no Django API which allows conversion of lookup to django field? model_field, _ = reduce( lambda model_tuple, field: self._get_model_field(model_tuple[1], field), field_lookup.split(LOOKUP_SEP), (None, self.model), ) if isinstance(model_field, LocalizedField): lang = translation.get_language() return KeyTransform(lang, field_lookup) elif isinstance(model_field, JSONField): return Cast(field_lookup, models.TextField()) return field_lookup
def test_key_transform_raw_expression(self): expr = RawSQL('%s::hstore', ['x => b, y => c']) self.assertSequenceEqual( HStoreModel.objects.filter(field__a=KeyTransform('x', expr)), self.objs[:2])
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 as_sql(self, compiler, connection): language = translation.get_language() or settings.LANGUAGE_CODE return KeyTransform(language, self.lhs).as_sql(compiler, connection)