48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
from typing import Optional, TYPE_CHECKING
|
|
|
|
from sqlalchemy import ForeignKey
|
|
from sqlalchemy.orm import relationship, Mapped, mapped_column
|
|
|
|
from models.base import BaseModel
|
|
from models.mixins import IdMixin, CreatedAtMixin, SoftDeleteMixin, LastModifiedAtMixin
|
|
|
|
if TYPE_CHECKING:
|
|
from models import Product
|
|
|
|
|
|
class Client(BaseModel, IdMixin, CreatedAtMixin, SoftDeleteMixin):
|
|
__tablename__ = "clients"
|
|
|
|
name: Mapped[str] = mapped_column(unique=True, comment="Название клиента")
|
|
|
|
company_name: Mapped[str] = mapped_column(comment="Название компании")
|
|
|
|
products: Mapped[list["Product"]] = relationship(
|
|
back_populates="client", lazy="noload"
|
|
)
|
|
|
|
details: Mapped["ClientDetails"] = relationship(
|
|
uselist=False,
|
|
back_populates="client",
|
|
cascade="all, delete",
|
|
lazy="joined",
|
|
)
|
|
|
|
comment: Mapped[Optional[str]] = mapped_column(comment="Комментарий")
|
|
|
|
|
|
class ClientDetails(BaseModel, IdMixin, LastModifiedAtMixin):
|
|
__tablename__ = "client_details"
|
|
|
|
client_id: Mapped[int] = mapped_column(
|
|
ForeignKey("clients.id"), unique=True, comment="ID клиента"
|
|
)
|
|
client: Mapped[Client] = relationship(
|
|
back_populates="details", cascade="all, delete", uselist=False
|
|
)
|
|
|
|
telegram: Mapped[Optional[str]] = mapped_column()
|
|
phone_number: Mapped[Optional[str]] = mapped_column()
|
|
inn: Mapped[Optional[str]] = mapped_column()
|
|
email: Mapped[Optional[str]] = mapped_column()
|