from typing import TYPE_CHECKING from sqlalchemy import ForeignKey, Column, Table, UniqueConstraint, Index from sqlalchemy.orm import mapped_column, Mapped, relationship from models import BaseModel if TYPE_CHECKING: from models import Project, Card cards_card_tags = Table( 'cards_card_tags', BaseModel.metadata, Column('card_id', ForeignKey('cards.id'), primary_key=True), Column('card_tag_id', ForeignKey('card_tags.id'), primary_key=True), ) class CardTag(BaseModel): __tablename__ = 'card_tags' id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(nullable=False) is_deleted: Mapped[bool] = mapped_column(default=False, server_default='0') project_id: Mapped[int] = mapped_column( ForeignKey('projects.id'), nullable=False, ) project: Mapped['Project'] = relationship( 'Project', back_populates='tags', lazy='noload', ) cards: Mapped[list['Card']] = relationship( secondary='cards_card_tags', lazy='noload', back_populates='tags', ) __table_args__ = ( Index('idx_card_name_project_id', 'name', 'project_id', 'is_deleted'), )