SQLAlchemy: запрос всех объектов без прямой связи

mohd874 спросил: 26 ноября 2017 в 04:31 в: python

Я новичок в ORM, поэтому любые комментарии приветствуются. Используя следующий код, я пытаюсь получить все контакты, связанные с определенной классификацией.

Base = declarative_base()contact_category_association_table = Table('contact_category_association', Base.metadata,
    Column('contact_id', Integer, ForeignKey('contacts.id')),
    Column('category_id', Integer, ForeignKey('contact_categories.id'))
)class Contact(Base):
    __tablename__ = 'contacts'    id = Column(Integer, primary_key=True)
    name = Column(String)
    categories = relationship('ContactCategory', secondary=contact_category_association_table)class ContactCategory(Base):
    __tablename__ = 'contact_categories'    id = Column(Integer, primary_key=True)
    name = Column(String)
    contacts = relationship('Contact', secondary=contact_category_association_table)
    classification_id = Column(Integer, ForeignKey('contact_classification.id'))
    classification = relationship('ContactClassification', back_populates='categories')class ContactClassification(Base):
    __tablename__ = 'contact_classification'    id = Column(Integer, primary_key=True)
    name = Column(String)
    categories = relationship('ContactCategory', back_populates='classification')

, используя следующие SQL Мне удалось получить результат, близкий к моим потребностям. Однако я не смог перевести это с помощью sqlalchemy ORM.

select * from contacts c
join contact_categories cc,  contact_category_association cca, contact_classification ccl
where c.id = cca.contact_id and cc.id = cca.category_id and ccl.id = cc.classification_id;

Результат, который я ищу, является объектом dict. Ключом будет идентификатор или название классификации. Значением будет список контактов.

Обновление:

Более подробно. Каждый контакт классифицируется по профессии (ContactCategory). Отношение между контактом и категорией много ко многим. Категории классифицируются (или группируются) на классы. Каждая категория может принадлежать 1 классу (один ко многим). Ниже приведены примеры данных:

Contacts
1|Alpha
2|Bear
3|Cel
4|Deer
5|ElkContactCategory
1|Builder|2
2|Carpenter|2
3|Metal Works|2
4|Networking & Cabling|1
5|Gypsum|2ContactClassification
1|Electronics
2|Building & Decor
3|Plumping & Pipingcontact_category_association
1|1
1|2
2|2
3|4
4|2
4|5
5|5

Используя ORM, я хочу получить следующий возможный результат (как объект python dict):

result = {
'Electronics': [<Cel>],
'Building & Decor': [<Alpha>, <Bear>, <Deer>, <Elk>],
'Plumping & Piping': []
}

Где ключ - это имя класса, а значение - список контактов, принадлежащих каждому классу (через категорию).

Извините, если имена таблиц сбивают с толку. Я нахожусь в процессе рефакторинга стороннего проекта, и у меня еще нет времени на переименование таблиц.

Ваша помощь приветствуется.


0 ответов