Страницы

Поиск по вопросам

понедельник, 13 мая 2019 г.

sqlalchemy отношения


Товарищи, подскажите, как с помощью sqlalchemy организовать такой функционал. Есть две таблицы: категории и под категории, во второй есть ключ на первую. Когда создается компания, она должна указывать направление деятельности, но ее деятельность, может быть гораздо уже и ограничиваться несколькими элементами из этой категории. Покажите, пример, как описать классы, и чтобы можно было получить все категории компании, категории и их под категории, а так же, чтобы по (под категориям и категориям) я мог найти все компании.


Ответ

А есть ли смысл разделять категории и подкатегории? Сделайте одну таблицу категорий, у которых есть ссылка на родительскую категорию (на себя же). Это позволит произвольную вложенность подкатегорий и уберет лишнюю сущность. Получится что-то вроде такого:
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String from sqlalchemy import ForeignKey from sqlalchemy.orm import relationship
Base = declarative_base()
class Company(Base): __tablename__ = 'company'
id = Column(Integer, primary_key=True) name = Column(String)
def __repr__(self): return 'class Category(Base): __tablename__ = 'category'
id = Column(Integer, primary_key=True) name = Column(String) parent_id = Column(Integer, ForeignKey('category.id'))
parent = relationship('Category', remote_side=id, backref='subcategories')
def __repr__(self): return 'class Relationship(Base): __tablename__ = 'relationships'
company_id = Column(Integer, ForeignKey('company.id'), primary_key=True) category_id = Column(Integer, ForeignKey('category.id'), primary_key=True)
company = relationship('Company', backref='categories') category = relationship('Category', backref='companies')
def __repr__(self): return 'Вот пример использования:
>>> c1 = Company(name='Google') >>> c2 = Company(name='Yahoo') >>> cat1 = Category(name='IT') >>> cat2 = Category(name='Search engine', parent=cat1) >>> cat1.subcategories [>> cat2.parent >>> c1.categories.extend([Relationship(category=cat1), Relationship(category=cat2)]) >>> c1.categories [>> c1.categories[1].category.name 'Search engine' >>> c2.categories []

Комментариев нет:

Отправить комментарий