Какой тип находится на другом конце отношения в sqlalchemy без создания объектов? - PullRequest
2 голосов
/ 27 сентября 2010

Как получить имя класса, которое должно быть на другом конце отношения? Это было заявлено при создании отношений. Я думаю, что информация должна быть где-то в sqlalchemy.orm.util.class_mapper

Допустим, у нас есть эти три класса и отношения между ними. Книга * --- 1 полка и Книга * --- * Автор

class Shelf(Base):
    __tablename__ = 'shelves'
    id = Column(Integer, primary_key = True)
    name = Column(String)
    #one-to-many books by backref in Book.shelf

    def __init__(self, name=""):
        self.name = name

class Book(Base):
    __tablename__ = 'books'
    id = Column(Integer, primary_key = True)
    title = Column(String)
    #many-to-one shelf
    shelf_id = Column(Integer, ForeignKey('shelves.id'))
    shelf = relationship(Shelf, backref=backref('books', order_by=id))
    def __init__(self, title=""):
        self.title = title

author_book = Table('author_book', metadata, 
                    Column('author_id', Integer, ForeignKey('authors.id')),
                    Column('book_id', Integer, ForeignKey('books.id'))
                    )

class Author(Base):
    __tablename__ = 'authors'
    id = Column(Integer, primary_key = True)
    name = Column(String)
    #many-to-many books
    books = relationship('Book', secondary=author_book, backref='authors')

    def __init__(self, name=""):
        self.name = name

Из class_mapper (Class) .iterate_properties мы можем легко получить различные свойства: ColumnProperty и RelationshipProperty. Должен быть способ получить по крайней мере название класса, который находится в связи. Есть идеи?

Ответы [ 3 ]

1 голос
/ 28 сентября 2010

Возможно, немного более аккуратное решение.

for prop in class_mapper(Shelf).iterate_properties:
    if isinstance(prop, sqlalchemy.orm.RelationshipProperty):
       print prop.mapper.class_

работает с одним ко многим и со многими ко многим в обоих направлениях

1 голос
/ 02 апреля 2014

Начиная с sqlalchemy 0.8 это можно сделать с помощью:

from sqlalchemy import inspect
inspect(Shelf).relationships['books'].mapper.class_
0 голосов
/ 28 сентября 2010

Я нашел какое-то решение, но я не уверен на 100%, работает ли оно всегда. Чтобы найти класс (тип), ожидаемый на другом конце отношения

class_mapper(Shelf)._props['books'].mapper.class_

Возможно, мы не знаемимена атрибутов (например, books в этом случае), но не составляет особого труда пройти словарь * _props * с поиском значений, которые являются экземплярами sqlalchemy.orm.properties.RelationshipProperty

...