Как реализовать связи в SQLite и FastAPI в приложении интернет-магазин?
Изучаем FastAPI, в общем-то по верхам прошли и то не все. Дали задачу - далеко впереди программы - написать простенький интернет магазин. возникла проблема со связью многие-ко-многим, не совсем ясно как все это реализовать через связующую таблицу. В общем, структура БД типовая: пользователь (в модели связь с таблицей заказов для получения заказов по его айди) - заказ - товар. Заказ-товар связь МКМ. Делал по примерам из инета, но там именно под структуру магазина что то не нашлось. В общем, таблицы создает, юзеров создает, товар создает, заказ создает (по заказу еще - передаю в него список словарей формата "айди товара - количество", и неясно, пишется в БД это поле или нет, ответ приходит 200 но не вижу товары в таблице заказов в ДБивер), по юзеру выводит заказы - а в связующей табле записи не делает. Должен же? Буду благодарен хотя бы за внятное описание процесса работы БД именно в случае с инет-магазом по типовым задачам - получать заказы пользователя и товары в этих заказах, да откуда там что берется, да на каких этапах что пишется в связующую таблицу. Модели SQLAlchemy ORM:
class Customer(Base): - юзер
__tablename__ = "customers"
id: Mapped[int] = mapped_column(primary_key=True, index=True)
email: Mapped[str]
password: Mapped[str]
name: Mapped[str]
data_create: Mapped[datetime] = mapped_column(default=datetime.utcnow)
data_change: Mapped[datetime] = mapped_column(default=datetime.utcnow)
role: Mapped[str] = mapped_column(default='user')
orders: Mapped[List["Order"]] = relationship(back_populates='customer', cascade='save-update, merge, delete')
class Order(Base): - заказ
__tablename__ = "orders"
id: Mapped[int] = mapped_column(primary_key=True, index=True)
date_create: Mapped[datetime] = mapped_column(default=datetime.utcnow)
date_change: Mapped[datetime] = mapped_column(default=datetime.utcnow)
status: Mapped[str]
customer_id: Mapped[str] = mapped_column(ForeignKey('customers.id'))
item: Mapped[List["OrderItem"]] = relationship(back_populates='order', cascade='save-update, merge, delete')
customer: Mapped["Customer"] = relationship(back_populates='orders')
class Item(Base): - товар
__tablename__ = "items"
id: Mapped[int] = mapped_column(primary_key=True, index=True)
name: Mapped[str]
description: Mapped[str]
image: Mapped[int]
data_create: Mapped[datetime] = mapped_column(default=datetime.utcnow)
data_change: Mapped[datetime] = mapped_column(default=datetime.utcnow)
category: Mapped[str]
price: Mapped[float]
quantity: Mapped[int]
orders: Mapped[List['OrderItem']] = relationship(back_populates='item')
class OrderItem(Base): - связующая таблица
__tablename__ = 'order_items'
order_id: Mapped[str] = mapped_column(ForeignKey('orders.id'), primary_key=True)
item_id: Mapped[str] = mapped_column(ForeignKey('items.id'), primary_key=True)
quantity: Mapped[int]
item: Mapped[str] = relationship('Item', back_populates='orders')
order: Mapped[str] = relationship('Order', back_populates='item')
@order_router.post("/add/") - роутер создать заказ
async def add_order(request:Request, customer_id: int, status:str, order: OrderCreateSchema, db: Session = Depends(get_db)):
new_order = Order(
customer_id = customer_id,
status = status,
item = [x.__dict__ for x in order]
)
db.add(new_order)
db.commit()
db.refresh(new_order)
return new_order
class OrderCreateSchema(BaseModel): - схема просто наследуется
pass