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 ba14aa5..568e01e 100644 --- a/fastapi_filter_sqlalchemy/filter_sqlalchemy.py +++ b/fastapi_filter_sqlalchemy/filter_sqlalchemy.py @@ -4,11 +4,12 @@ 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 from .base import BaseFilterModel +from .constants import EMPTY_STRING def _backward_compatible_value_for_like_and_ilike(value: str): @@ -212,19 +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, 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) + 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( - func.lower(getattr(self.Constants.model, field_name)).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 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"}]