2011-07-27 25 views
7

Tengamos las clases X e Y y las relaciones entre ellas x2y y y2x. Desde el iterador class_mapper (Class) .iterate_properties podemos obtener todas las propiedades de la clase. Entonces x2y y y2x son RelationshipProperty y de lo que espero obtener es una clase o un nombre de clase de objetos en el lado remoto de la relación.¿Cómo encontrar la clase o el nombre de clase del objeto del lado remoto de sqlalchemy sin consultas de DB?

Ya he intentado hacer una solución. He encontrado x2y.remote_side[0].table.name, hice un tables_map que mapea el nombre de una tabla a una clase y funciona bien para uno a muchos y uno a uno. Si lo uso para muchos a muchos, el nombre de la tabla es una tabla de asociación.

¿Alguna pista sobre cómo puedo obtener la clase de control remoto?

Respuesta

18

X.x2y.property.mapper.class_

relatonshipproperty finalmente obtener la documentación de atributos de nivel de clase lo mismo que mapeador hace ahora.

editar. Aquí está una prueba que ilustra lo anterior regresar en "Y" de "X", y sin reflexión no crea relaciones para no debe tener efecto:

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

Eso me ha devuelto X no Y. ¿Puede suceder esto porque uso reflect? – mdob

1

he encontrado que un argumento de un método() en relationshipproperty devuelve clase remota.

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

argumento() es solo lo que se pasó a la función relationship() originalmente y no necesariamente es invocable. "mapper" es el mapeador al que se refiere la relación. – zzzeek

Cuestiones relacionadas