Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions fastapi_filter_sqlalchemy/constants.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
EMPTY_STRING = ""
19 changes: 11 additions & 8 deletions fastapi_filter_sqlalchemy/filter_sqlalchemy.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 <elfimovserg@gmail.com>"]
packages = [{include = "fastapi_filter_sqlalchemy"}]
Expand Down
Loading