From 9f6a242152dee56a2ffc61fc69eebf490e636be3 Mon Sep 17 00:00:00 2001 From: "Sergei V. Elfimov" Date: Mon, 4 Aug 2025 09:54:25 +0300 Subject: [PATCH 1/2] fix: method sort into base classes "Filter". --- fastapi_filter_sqlalchemy/filter_sqlalchemy.py | 12 ++++-------- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/fastapi_filter_sqlalchemy/filter_sqlalchemy.py b/fastapi_filter_sqlalchemy/filter_sqlalchemy.py index ba14aa5..07d2ce5 100644 --- a/fastapi_filter_sqlalchemy/filter_sqlalchemy.py +++ b/fastapi_filter_sqlalchemy/filter_sqlalchemy.py @@ -4,7 +4,7 @@ from warnings import warn from pydantic import ValidationInfo, field_validator -from sqlalchemy import Integer, String, cast, func, or_ +from sqlalchemy import BigInteger, String, cast, func, or_ from sqlalchemy.orm import Query from sqlalchemy.sql.selectable import Select @@ -213,15 +213,11 @@ def sort(self, query: Query | Select): field_name = field_name.replace("-", "").replace("+", "") order_by_field = getattr(self.Constants.model, field_name) if field_name in self.Constants.ordering_convert_str_to_int_fields: - order_by_field = cast(order_by_field, Integer) - query = query.add_columns( - cast(getattr(self.Constants.model, field_name), Integer).label(f"{field_name}_integer_value") - ) + order_by_field = cast(order_by_field, BigInteger) + query = query.add_columns(order_by_field.label(f"{field_name}_integer_value")) if field_name in self.Constants.ordering_lower_case_fields: order_by_field = func.lower(order_by_field) - query = query.add_columns( - func.lower(getattr(self.Constants.model, field_name)).label(f"{field_name}_lower_case") - ) + query = query.add_columns(order_by_field.label(f"{field_name}_lower_case")) if field_name in self.Constants.ordering_fk_fields_mapping: model = self.Constants.ordering_fk_fields_mapping[field_name] order_by_field = getattr(model, base_field_name) diff --git a/pyproject.toml b/pyproject.toml index e3a19e8..811ca53 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ ignore_missing_imports = true [tool.poetry] name = "fastapi-filter-sqlalchemy" -version = "0.0.4" +version = "0.0.5" description = "FastAPI filter SQLAlchemy" authors = ["Sergey V. Elfimov "] packages = [{include = "fastapi_filter_sqlalchemy"}] From f2295a50dd4cf73f70a661f9260b32ac1ab00430 Mon Sep 17 00:00:00 2001 From: "Sergei V. Elfimov" Date: Mon, 4 Aug 2025 10:14:24 +0300 Subject: [PATCH 2/2] fix: in method sort, change method call location add_columns obj query. --- fastapi_filter_sqlalchemy/constants.py | 1 + fastapi_filter_sqlalchemy/filter_sqlalchemy.py | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 fastapi_filter_sqlalchemy/constants.py diff --git a/fastapi_filter_sqlalchemy/constants.py b/fastapi_filter_sqlalchemy/constants.py new file mode 100644 index 0000000..59fea74 --- /dev/null +++ b/fastapi_filter_sqlalchemy/constants.py @@ -0,0 +1 @@ +EMPTY_STRING = "" diff --git a/fastapi_filter_sqlalchemy/filter_sqlalchemy.py b/fastapi_filter_sqlalchemy/filter_sqlalchemy.py index 07d2ce5..568e01e 100644 --- a/fastapi_filter_sqlalchemy/filter_sqlalchemy.py +++ b/fastapi_filter_sqlalchemy/filter_sqlalchemy.py @@ -9,6 +9,7 @@ from sqlalchemy.sql.selectable import Select from .base import BaseFilterModel +from .constants import EMPTY_STRING def _backward_compatible_value_for_like_and_ilike(value: str): @@ -212,15 +213,21 @@ def sort(self, query: Query | Select): field_name = field_name.replace("-", "").replace("+", "") order_by_field = getattr(self.Constants.model, field_name) + additional_field_name = EMPTY_STRING if field_name in self.Constants.ordering_convert_str_to_int_fields: order_by_field = cast(order_by_field, BigInteger) - query = query.add_columns(order_by_field.label(f"{field_name}_integer_value")) + additional_field_name = "integer_value" if field_name in self.Constants.ordering_lower_case_fields: order_by_field = func.lower(order_by_field) - query = query.add_columns(order_by_field.label(f"{field_name}_lower_case")) + additional_field_name = "lower_case" if field_name in self.Constants.ordering_fk_fields_mapping: model = self.Constants.ordering_fk_fields_mapping[field_name] order_by_field = getattr(model, base_field_name) + + # Here add new columns, so that you can sort by them. + if additional_field_name is not EMPTY_STRING: + query = query.add_columns(order_by_field.label(f"{field_name}_{additional_field_name}")) + query = query.order_by(getattr(order_by_field, direction)()) return query