Добавить сортировку при выборке из Бд - SQLAlchemy

Я не знаком с пайтоном и тем более с SQLAlchemy. Один паренек написал нам код и пропал, а нам надо добавить сортировку в запрос. В классе CRUD, вот в этот метод:

    @staticmethod
    def get_distinct_column(db_session: Session, column: str) -> List[dict]:
        # city,  partner_id, site
        ds = db_session.query(getattr(OrdersTable, column)).distinct().filter(getattr(OrdersTable, column) != '').all()
        return [u._asdict() for u in ds]

Я пытался сделать так:

ds = db_session.query(getattr(OrdersTable, column)).distinct().filter(getattr(OrdersTable, column) != '').order_by(f"{column}").all()

Не работает. Прошу помощи. также есть такие фрагменты:

class OrdersTable(Base):
    """Model user"""
    __tablename__ = 'orders'
    __table_args__ = {'autoload': True}

и вызов метода :

@app.get('/params/{column}', response_model=List[schemas.Parems], summary='Получение параметров', tags=["Analytic"])
async def get_params(column: str, db: Session = Depends(get_db), user=Depends(user_fastapi.current_user(active=True))):
    data_params = crud_orders.get_distinct_column(db, column)
    items = []
    for item in data_params:
        for key, value in item.items():
            items.append(schemas.Parems(key=key, value=value).dict())
    return [dict(s) for s in set(frozenset(d.items()) for d in items)]

УПД сделал в методе get_distinct_column:

ds = db_session.query(getattr(OrdersTable, column)).distinct().filter(getattr(OrdersTable, column) != '').order_by(getattr(OrdersTable, column)).all()

работает, но порядка нет, хотя он и стал другим. потом сделал в main.py в методе async def get_params:

return [dict(s) for s in (frozenset(d.items()) for d in items)]

убрал set перестало работать совсем


Ответы (2 шт):

Автор решения: Alpensin

order_by на вход принимает сами атрибуты класса, привязанные к колонкам таблицы. А вы пытаетесь передать строку с названием колонки. Для получения объекта самого атрибута используйте подход автора функции - getattr(OrdersTable, column)

ds = db_session.query(getattr(OrdersTable, column)).distinct().filter(getattr(OrdersTable, column) != '').order_by(getattr(OrdersTable, column)).all()

Для лучшей читаемости можно так

@staticmethod
def get_distinct_column(db_session: Session, column: str) -> List[dict]:
    # city,  partner_id, site
    selected_column = getattr(OrdersTable, column)
    ds = db_session.query(selected_column).distinct().filter(selected_column != '').order_by(selected_column).all()
    return [u._asdict() for u in ds]

Вы добавили ещё код. Там порядок и ломается. Не буду вникать в целесообразность всей конструкции, но для восстановления порядка попробуйте это

return [dict(s) for s in set(frozenset(d.items()) for d in items)]

Поменять на это

return [dict(s) for s in (frozenset(d.items()) for d in items)]
→ Ссылка
Автор решения: Elm Elm

вобщем ларчик просто открывался:
заменил return в async def get_params вместо

return [dict(s) for s in (frozenset(d.items()) for d in items)]

просто

return items

и - о, чудо, всё стало как надо.

Спасибо огромное господину Alpensin, за то, что вдохновил на поиски решения.

→ Ссылка