I have Django experience. Now I would like to try some DIY python packages to my mini project. I Here is my code.
models.py
import enumfrom datetime import date, datetimefrom sqlalchemy import UniqueConstraintfrom sqlmodel import Field, SQLModelclass StatusEnum(enum.Enum):"""Enum class of status field.""" pending = "pending" in_progress = "in_progress" completed = "completed"class TaskContent(SQLModel, table=True):"""Model class for TaskContent history.""" identifier: str = Field(primary_key=True) # For redo mechanism id: int = Field(primary_key=False) # For human use title: str = Field(nullable=True) description: str = Field(nullable=True) due_date: date = Field(default=None, nullable=True) status: StatusEnum = Field(default=StatusEnum.pending) is_deleted: bool = Field(default=False) # For redo mechanism created_by: int = Field(nullable=True, default=None, foreign_key="user.id") created_at: datetime = Field(default=datetime.now()) # For redo mechanismclass CurrentTaskContent(SQLModel, table=True):"""Model class for current.""" # https://github.com/tiangolo/sqlmodel/issues/114 __table_args__ = (UniqueConstraint("identifier", "id"), ) identifier: str = Field(primary_key=True) # For redo mechanism id: int = Field(primary_key=False) # For human use created_by: int = Field(nullable=True, default=None, foreign_key="user.id") updated_by: int = Field(nullable=True, default=None, foreign_key="user.id") created_at: datetime = Field(default=datetime.now()) updated_at: datetime = Field(default=datetime.now())class User(SQLModel, table=True):"""User model of this application.""" id: int = Field(primary_key=True) username: str = Field(nullable=False)
main.py
def get_queryset() -> sqlalchemy.orm.query.Query:"""Get the queryset of tasks.""" with (Session(engine) as session): # List out available id. available_id_list = session.query(CurrentTaskContent).all() available_identifier_list = [i.identifier for i in available_id_list] # Get task and id queryset_tasks = session.query(TaskContent).filter( TaskContent.identifier.in_(available_identifier_list) ).subquery() # Get username and id username_query = session.query(User.username, User.id).subquery() # Join the queryset and username final_query = session.query(queryset_tasks, username_query).outerjoin( username_query, and_(queryset_tasks.c.created_by == username_query.c.id) ) return final_query
The tasks_queryset.count()
is 5
which is correct. My database has only 5 rows.Then I try to filter again by due_date
with the following.
Problem:aa
and bb
both of them shows me 25
which is not what I need.
aa = tasks_queryset.filter(tasks_queryset.subquery().c.due_date == due_date_instance)bb = tasks_queryset.filter(TaskContent.due_date == due_date_instance)
Question:
How to filter the tasks_queryset
with given due_date
?