2011-07-27 1 views
7

X와 Y 클래스와 x2y와 y2x 클래스 사이의 관계를 봅시다. class_mapper (Class) .iterate_properties iterator에서 모든 클래스의 속성을 가져올 수 있습니다. 그래서 x2y와 y2x는 RelationshipProperty이고 나는 관계의 원격 측에있는 객체의 클래스 또는 클래스 이름을 얻고 싶습니다.db 쿼리없이 sqlalchemy 원격 측 오브젝트의 클래스 또는 클래스 이름을 찾는 방법은 무엇입니까?

저는 이미 해결책을 찾으려했습니다. x2y.remote_side[0].table.name을 찾았습니다. 테이블 이름을 클래스에 매핑하는 tables_map을 만들었고 일대 다 및 일대일로 잘 작동합니다. 다 대다 (many-to-many)로 사용하면 테이블 이름이 연결 테이블입니다.

원격 보조 클래스를 얻는 방법에 대한 힌트가 있습니까?

답변

18

X.x2y.property.mapper.class_

relatonshipproperty 결국 매퍼와 같은 지금 않는 클래스 - 레벨 속성 문서를 얻을 것이다.

편집. 여기에 "X"에서 위 복귀 "Y"를 설명하는 시험이기 때문에 관계를 만들지 않습니다 더 반사 효과가 없습니다해야 내가 찾은

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 
+0

내가 X가 아닌 Y를 반환했습니다. 반영을 사용하기 때문에 이러한 일이 발생할 수 있습니까? – mdob

1

그 relationshipproperty의 메소드 인수() 원격 클래스를 반환합니다.

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

argument()는 원래 relationship() 함수에 전달 된 것일뿐 호출이 반드시 필요한 것은 아닙니다. "매퍼 (mapper)"는 관계가 의미하는 매퍼 (mapper)입니다. – zzzeek

관련 문제