Пример #1
0
    def _add_language_filter(self):
        if self._language_filter_tag:  # pragma: no cover
            raise RuntimeError(
                'Queryset is already tagged. This is a bug in hvad')
        self._language_filter_tag = True
        self.query.language_code = self._language_code

        if self._language_code == 'all':
            self._add_select_related()

        elif self._language_fallbacks:
            if self._raw_select_related:
                raise NotImplementedError('Using select_related along with '
                                          'fallbacks() is not supported')
            languages = tuple(get_language() if lang is None else lang
                              for lang in (self._language_code, ) +
                              self._language_fallbacks)
            masteratt = self.model._meta.get_field('master').attname
            alias = self.query.join(
                Join(self.model._meta.db_table, self.query.get_initial_alias(),
                     None, LOUTER,
                     BetterTranslationsField(languages,
                                             master=masteratt), True))

            add_alias_constraints(self, (self.model, alias), id__isnull=True)
            self.query.add_filter(('%s__isnull' % masteratt, False))
            if not self._skip_master_select and getattr(self, '_fields',
                                                        None) is None:
                self.query.add_select_related(('master', ))

        else:
            language_code = self._language_code or get_language()
            self.query.add_filter(('language_code', language_code))
            self._add_select_related()

        # if queryset is about to use the model's default ordering, we
        # override that now with a translated version of the model's ordering
        if self.query.default_ordering and not self.query.order_by:
            ordering = self.shared_model._meta.ordering
            self.query.order_by = self._translate_fieldnames(ordering or [])

        return self
Пример #2
0
    def _add_language_filter(self):
        if self._language_filter_tag: # pragma: no cover
            raise RuntimeError('Queryset is already tagged. This is a bug in hvad')
        self._language_filter_tag = True

        if self._language_code == 'all':
            self._add_select_related(F('language_code'))

        elif self._language_fallbacks:
            if self._raw_select_related:
                raise NotImplementedError('Using select_related along with '
                                          'fallbacks() is not supported')
            languages = tuple(get_language() if lang is None else lang
                              for lang in (self._language_code,) + self._language_fallbacks)
            masteratt = self.model._meta.get_field('master').attname
            alias = self.query.join(Join(
                self.model._meta.db_table,
                self.query.get_initial_alias(),
                None,
                LOUTER,
                BetterTranslationsField(languages, master=masteratt),
                True
            ))

            add_alias_constraints(self, (self.model, alias), id__isnull=True)
            self.query.add_filter(('%s__isnull' % masteratt, False))
            if not self._skip_master_select and getattr(self, '_fields', None) is None:
                self.query.add_select_related(('master',))

        else:
            language_code = self._language_code or get_language()
            self.query.add_filter(('language_code', language_code))
            self._add_select_related(language_code)

        # if queryset is about to use the model's default ordering, we
        # override that now with a translated version of the model's ordering
        if self.query.default_ordering and not self.query.order_by:
            ordering = self.shared_model._meta.ordering
            self.query.order_by = self._translate_fieldnames(ordering or [])

        return self