2011-07-27 6 views
7

X ve Y sınıflarına ve x2y ile y2x arasındaki ilişkilere sahip olalım. class_mapper (Class) .iterate_properties yineleyicisinden tüm sınıfın özelliklerini alabiliriz. Yani x2y ve y2x, RelationshipProperty ve almayı umduğum şey, ilişkinin uzak tarafındaki nesnelerin sınıf veya sınıf adıdır.Db sorguları olmadan sqlalchemy uzak yan nesnenin sınıf veya sınıf adı nasıl bulunur?

Zaten bir çözüm üretmeye çalıştım. x2y.remote_side[0].table.name'u buldum, bir tabloyu bir sınıfa eşleyen bir tablo oluşturdu ve bire-bire ve bire bir için iyi çalışıyor. Çoktan çoğa kullanırsam tablo adı bir ilişkilendirme tablosudur.

Uzak taraf sınıfına nasıl ulaşabilirim?

cevap

18

X.x2y.property.mapper.class_

relatonshipproperty sonuçta eşleştiricisindeki aynı anda yapar sınıf düzeyindeki nitelik belgeleri alacak.

düzenleme. İşte "X" den yukarıda dönen "Y" gösteren bir testtir ve bu yüzden ilişkileri yaratmaz hiçbir yansıma etkisi olması gerekir: buldum

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

Bu bana X değil Y. geri döndü Bu yansıma kullanıyorum çünkü olabilir mi? – mdob

1

o relationshipproperty bir yöntem argümanı() uzak sınıfı döndürür.

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

argümanı(), yalnızca ilişki() işlevine orijinal olarak aktarılmış olan ve yalnızca bir çağrılabilir değil. "mapper", ilişkinin başvurduğu mapper'tir. – zzzeek