def filter(self, _exclude: bool = False, **kwargs: Any) -> "QuerySet": # noqa: A003 qryclause = QueryClause( model_cls=self.model, select_related=self._select_related, filter_clauses=self.filter_clauses, ) filter_clauses, select_related = qryclause.filter(**kwargs) if _exclude: exclude_clauses = filter_clauses filter_clauses = self.filter_clauses else: exclude_clauses = self.exclude_clauses filter_clauses = filter_clauses return self.__class__( model_cls=self.model, filter_clauses=filter_clauses, exclude_clauses=exclude_clauses, select_related=select_related, limit_count=self.limit_count, offset=self.query_offset, columns=self._columns, exclude_columns=self._exclude_columns, order_bys=self.order_bys, )
def _get_filter_for_prefetch( self, parent_model: Type["Model"], target_model: Type["Model"], reverse: bool, related: str, ) -> List: ids = self._extract_required_ids( parent_model=parent_model, target_model=target_model, reverse=reverse, ) if ids: ( clause_target, filter_column, ) = parent_model.get_clause_target_and_filter_column_name( parent_model=parent_model, target_model=target_model, reverse=reverse, related=related, ) qryclause = QueryClause( model_cls=clause_target, select_related=[], filter_clauses=[], ) kwargs = {f"{filter_column}__in": ids} filter_clauses, _ = qryclause.filter(**kwargs) return filter_clauses return []
def filter(self, _exclude: bool = False, **kwargs: Any) -> "QuerySet": # noqa: A003 """ Allows you to filter by any `Model` attribute/field as well as to fetch instances, with a filter across an FK relationship. You can use special filter suffix to change the filter operands: * exact - like `album__name__exact='Malibu'` (exact match) * iexact - like `album__name__iexact='malibu'` (exact match case insensitive) * contains - like `album__name__contains='Mal'` (sql like) * icontains - like `album__name__icontains='mal'` (sql like case insensitive) * in - like `album__name__in=['Malibu', 'Barclay']` (sql in) * gt - like `position__gt=3` (sql >) * gte - like `position__gte=3` (sql >=) * lt - like `position__lt=3` (sql <) * lte - like `position__lte=3` (sql <=) * startswith - like `album__name__startswith='Mal'` (exact start match) * istartswith - like `album__name__istartswith='mal'` (case insensitive) * endswith - like `album__name__endswith='ibu'` (exact end match) * iendswith - like `album__name__iendswith='IBU'` (case insensitive) :param _exclude: flag if it should be exclude or filter :type _exclude: bool :param kwargs: fields names and proper value types :type kwargs: Any :return: filtered QuerySet :rtype: QuerySet """ qryclause = QueryClause( model_cls=self.model, select_related=self._select_related, filter_clauses=self.filter_clauses, ) filter_clauses, select_related = qryclause.prepare_filter(**kwargs) if _exclude: exclude_clauses = filter_clauses filter_clauses = self.filter_clauses else: exclude_clauses = self.exclude_clauses filter_clauses = filter_clauses return self.__class__( model_cls=self.model, filter_clauses=filter_clauses, exclude_clauses=exclude_clauses, select_related=select_related, limit_count=self.limit_count, offset=self.query_offset, columns=self._columns, exclude_columns=self._exclude_columns, order_bys=self.order_bys, prefetch_related=self._prefetch_related, limit_raw_sql=self.limit_sql_raw, )
def filter( # noqa: A003 self, *args: Any, _exclude: bool = False, **kwargs: Any) -> "QuerySet[T]": """ Allows you to filter by any `Model` attribute/field as well as to fetch instances, with a filter across an FK relationship. You can use special filter suffix to change the filter operands: * exact - like `album__name__exact='Malibu'` (exact match) * iexact - like `album__name__iexact='malibu'` (exact match case insensitive) * contains - like `album__name__contains='Mal'` (sql like) * icontains - like `album__name__icontains='mal'` (sql like case insensitive) * in - like `album__name__in=['Malibu', 'Barclay']` (sql in) * isnull - like `album__name__isnull=True` (sql is null) (isnotnull `album__name__isnull=False` (sql is not null)) * gt - like `position__gt=3` (sql >) * gte - like `position__gte=3` (sql >=) * lt - like `position__lt=3` (sql <) * lte - like `position__lte=3` (sql <=) * startswith - like `album__name__startswith='Mal'` (exact start match) * istartswith - like `album__name__istartswith='mal'` (case insensitive) * endswith - like `album__name__endswith='ibu'` (exact end match) * iendswith - like `album__name__iendswith='IBU'` (case insensitive) :param _exclude: flag if it should be exclude or filter :type _exclude: bool :param kwargs: fields names and proper value types :type kwargs: Any :return: filtered QuerySet :rtype: QuerySet """ filter_groups, select_related = self._resolve_filter_groups( groups=args) qryclause = QueryClause( model_cls=self.model, select_related=select_related, filter_clauses=self.filter_clauses, ) filter_clauses, select_related = qryclause.prepare_filter(**kwargs) filter_clauses = filter_clauses + filter_groups # type: ignore if _exclude: exclude_clauses = filter_clauses filter_clauses = self.filter_clauses else: exclude_clauses = self.exclude_clauses filter_clauses = filter_clauses return self.rebuild_self( filter_clauses=filter_clauses, exclude_clauses=exclude_clauses, select_related=select_related, )
def _get_filter_for_prefetch( self, parent_model: Type["Model"], target_model: Type["Model"], reverse: bool, related: str, ) -> List: """ Populates where clause with condition to return only models within the set of extracted ids. If there are no ids for relation the empty list is returned. :param parent_model: model from which related ids should be extracted :type parent_model: Type["Model"] :param target_model: model to which relation leads to :type target_model: Type["Model"] :param reverse: flag if the relation is reverse :type reverse: bool :param related: name of the field with relation :type related: str :return: :rtype: List[sqlalchemy.sql.elements.TextClause] """ ids = self._extract_required_ids(parent_model=parent_model, reverse=reverse, related=related) if ids: ( clause_target, filter_column, ) = parent_model.get_clause_target_and_filter_column_name( parent_model=parent_model, target_model=target_model, reverse=reverse, related=related, ) qryclause = QueryClause( model_cls=clause_target, select_related=[], filter_clauses=[], ) kwargs = {f"{filter_column}__in": ids} filter_clauses, _ = qryclause.prepare_filter(**kwargs) return filter_clauses return []