Как найти sqlalchemy класс удаленного объекта или имя класса без db запросов? - PullRequest
7 голосов
/ 27 июля 2011

Давайте иметь классы X и Y и отношения между ними x2y и y2x.Из итератора class_mapper (Class) .iterate_properties мы можем получить все свойства класса.Таким образом, x2y и y2x являются RelationshipProperty, и я надеюсь получить от них класс или имя класса объектов на удаленной стороне отношения.

Я уже пытался найти решение.Я нашел x2y.remote_side[0].table.name, создал table_map, который сопоставляет имя таблицы с классом, и она отлично работает для «один ко многим» и «один к одному».Если я использую его для многих ко многим, то имя таблицы является таблицей ассоциации.

Есть ли какие-либо советы о том, как получить класс удаленной стороны?

Ответы [ 2 ]

19 голосов
/ 27 июля 2011

X.x2y.property.mapper.class_

relatonshipproperty в конечном итоге получит документацию по атрибутам уровня класса так же, как теперь делает mapper.

редактировать. Вот тест, который иллюстрирует вышеприведенный возврат «Y» из «X», и никакое отражение не создает отношений, поэтому не должно иметь никакого эффекта:

from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
class X(Base):
    __tablename__ = 'x'
    id = Column(Integer, primary_key=True)
    x2y = relationship("Y")

class Y(Base):
    __tablename__ = 'y'
    id = Column(Integer, primary_key=True)
    x_id = Column(Integer, ForeignKey("x.id"))

assert X.x2y.property.mapper.class_ is Y
2 голосов
/ 31 июля 2011

Я обнаружил, что аргумент метода () для Relationshipproperty возвращает удаленный класс.

for prop in class_mapper(X).iterate_properties:
    if isinstance(prop, RelationshipProperty):
        relation = prop
relation.argument()
...