fixing ann_filters function

This commit is contained in:
DmitryGantimurov 2023-09-02 15:32:20 +03:00
parent 2c870ee983
commit f744cce713

View File

@ -1,4 +1,5 @@
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from sqlalchemy.sql import text, literal_column
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from typing import Annotated from typing import Annotated
from fastapi import Depends from fastapi import Depends
@ -48,18 +49,45 @@ async def add_poems_to_db(async_db: AsyncSession):
async def filter_ann(schema: pydantic_schemas.SortAnnouncements, db: AsyncSession): async def filter_ann(schema: pydantic_schemas.SortAnnouncements, db: AsyncSession):
"""Функция для последовательного применения различных фильтров (через схему SortAnnouncements)""" """Функция для последовательного применения различных фильтров (через схему SortAnnouncements)"""
res = await db.execute(select(orm_models.Announcement)) # fields = schema.__dict__ # параметры передоваемой схемы SortAnnouncements (ключи и значения)
res = res.fetchall() # # проходим по названиям фильтров и их значениям
fields = schema.__dict__ # параметры передоваемой схемы SortAnnouncements (ключи и значения) # for name, filt_val in fields.items():
# проходим по названиям фильтров и их значениям # # создаем выражение sql запроса
for name, filt in fields.items(): # statement = text("SELECT * FROM announcements ")
# если фильтр задан # # выбираем все строки
if filt is not None: # query = await db.execute(statement)
d = {name: filt} # res = query.all()
# фильтруем # # если фильтр задан
res = await res.filter_by(**d) # if filt_val is not None:
# to_intersect_query = await db.execute(select(orm_models.Announcement).where(literal_column(f"announcements.{name}") == filt_val))
# to_intersect = to_intersect_query.all()
# res = res.intersect(to_intersect)
# отфильтровываем подходящие объявления
res = await db.execute(select(orm_models.Announcement)
.where(schema.obsolete != None and orm_models.Announcement.obsolete == schema.obsolete
and schema.user_id != None and orm_models.Announcement.user_id == schema.user_id
and schema.metro != None and orm_models.Announcement.metro == schema.metro
and )
# .where(schema.user_id != None and orm_models.Announcement.user_id == schema.user_id)
# .where(schema.metro != None and orm_models.Announcement.metro == schema.metro)
# .where(schema.category != None and orm_models.Announcement.category == schema.category)
)
# statement = text("SELECT * FROM announcements "
# "WHERE announcements.obsolete = :obsolete "
# "AND announcements.user_id == :user_id "
# "AND announcements.metro == :metro "
# "AND announcements.category == :category")
# res = await db.execute(statement,
# {"obsolete": schema.obsolete,
# "user_id": schema.user_id,
# "metro": schema.metro,
# "category": schema.category}
# )
# возвращаем все подходящие объявления # возвращаем все подходящие объявления
await res.all()
return res.scalars().all()
async def check_obsolete(db: AsyncSession, current_date: datetime.date): async def check_obsolete(db: AsyncSession, current_date: datetime.date):
@ -67,7 +95,8 @@ async def check_obsolete(db: AsyncSession, current_date: datetime.date):
Функция участвует в процессе обновления поля obsolete у всех объявлений раз в сутки Функция участвует в процессе обновления поля obsolete у всех объявлений раз в сутки
""" """
# обращаемся ко всем объявлениям бд # обращаемся ко всем объявлениям бд
announcements = await db.execute(select(orm_models.Announcement)).scalars().all() query_announcements = await db.execute(select(orm_models.Announcement))
announcements = query_announcements.scalars().all()
# для каждого объявления # для каждого объявления
for ann in announcements: for ann in announcements:
# если просрочено # если просрочено