Понимание самоссылающихся таблиц
Самоссылающаяся таблица(self-referential) - это таблица, которая ссылается на себя через внешний ключ. Для отношений категория-подкатегория это означает наличие единой таблицы, где каждая запись может указывать на свою родительскую категорию.
Вот как мы можем определить такую таблицу с помощью SQLAlchemy, изменим код в models/category.py
from app.backend.db import Base
from sqlalchemy import Column, Integer, String, Boolean, ForeignKey
from sqlalchemy.orm import relationship
from app.models.products import Product
class Category(Base):
__tablename__ = 'categories'
id = Column(Integer, primary_key=True, index=True)
name = Column(String)
slug = Column(String, unique=True, index=True)
is_active = Column(Boolean, default=True)
parent_id = Column(Integer, ForeignKey('categories.id'), nullable=True)
products = relationship("Product", back_populates="category")
Отношения в такой таблице определяются двумя полями:
id(первичный ключ)parent_id(внешний ключ, может быть пустым)
Обратите внимание, что parent_id - это внешний ключ, который ссылается на одну и ту же таблицу.
Когда мы будем добавлять категорию в таблицу, нам нужно установить parent_id как Null, чтобы установить категорию как главную, или добавить parent_id как id любой другой категории, чтобы сделать ее подкатегорией.
В результате мы получим следующие SQL инструкции для таблицы категорий:
CREATE TABLE categories (
id INTEGER NOT NULL,
name VARCHAR,
slug VARCHAR,
is_active BOOLEAN,
parent_id INTEGER,
PRIMARY KEY (id),
FOREIGN KEY(parent_id) REFERENCES categories (id)
)
Эта таблица будет иметь следующую схему:
Использование SQLAlchemy для управления категориями и подкатегориями в одной таблице является мощным способом работы с иерархическими данными в ваших приложениях Python. Используя самоссылающиеся таблицы и понимая отношения между вашими сущностями, вы можете эффективно обрабатывать сложные структуры данных, которые отражают реальные иерархии.
На данный момент мы будем работать с этими двумя моделями, далее по курсу мы будем постоянно дорабатывать их и дорабатывать функционал нашего проекта.
Мы видим что у наших таблиц появилась связь, в следующем разделе мы научимся создавать таблицы посредством SQLAlchemy и научимся выполнять миграции через Alembic.