2011-09-25 2 views
14
aynı masaya iki ilişki nasıl tanımlanır

Ben SQLAlchemy öğretici ve benzeri diğer sorular üzerinden tüm baktım fakat bu işe katılmak almak için mücadele gibi görünüyor:sqlalchemy

senaryo: Ben Page modeliyle temsil edilen bir pages tablonuz var. Sayfalar bir kullanıcı tarafından oluşturulabilir ve bir kullanıcı tarafından düzenlenebilir, ancak mutlaka aynı olmayabilir. Benim Page modeli bu (özet) gibi görünür:

class Page(Base): 
    __tablename__ = 'pages' 

    id = Column(Integer, primary_key = True) 
    slug = Column(Text) 
    title = Column(Text) 
    direct_link = Column(Text) 
    body = Column(Text) 
    category_id = Column(Integer, ForeignKey('categories.id')) 
    published_on = Column(DateTime) 
    publishing_user_id = Column(Integer, ForeignKey('users.id')) 
    last_edit_on = Column(DateTime) 
    last_edit_user_id = Column(Integer, ForeignKey('users.id')) 

    # Define relationships 
    publish_user = relationship('User', backref = backref('pages', order_by = id), primaryjoin = "Page.publishing_user_id == User.id") 
    edit_user = relationship('User', primaryjoin = "Page.last_edit_user_id == User.id") 
    category = relationship('Category', backref = backref('pages', order_by = id)) 

Benim kullanıcıların User modeli ile temsil kullanıcıların tabloda saklanır. Bunu arayan SQLAlchemy belgelerinin her yerinde olduğumu söylediğim gibi, bunların mümkün olduğunca örneklerine benzemeye çalıştım, ancak boşuna hayır. Herhangi bir yardım büyük takdir edilecektir.

+0

Im sağ ben yapmak istediğim için kurmak ive emin değil

publish_user = relationship(User, foreign_keys=[publishing_user_id], backref=backref('pages', order_by=id)) edit_user = relationship(User, foreign_keys=[last_edit_user_id]) 

Belgeler. Bir sorgudan bir sayfa alabilmek ve yayınlama kullanıcısını almak için page.publish_user sayfasını arayabilmek istiyorum. Aşağıdaki öneriyi denedim, ama yine de hayır şans – richzilla

+0

Çalışmıyor diyorsunuz, ama daha spesifik olabilirsiniz - bir hata, beklenmedik bir dönüş değeri, ne? Gönderdiğiniz kodda belirgin bir sorun görmüyorum. – FMc

cevap

2

foreign_keys seçeneği deneyin:

publish_user = relationship(User, foreign_keys=publishing_user_id, 
            primaryjoin=publishing_user_id == User.id, 
            backref=backref('pages', order_by=id)) 
edit_user = relationship(User, foreign_keys=last_edit_user_id, 
           primaryjoin=last_edit_user_id == User.id) 
+1

'' foreign_keys' 'öğesini eklediğinizde ve koşulu birleştirilebiliyorsa,' 'primaryjoin'' öznitelikleri eklemenize gerek yoktur. – user2683246

7

ben neredeyse doğru var düşünüyorum; Yalnızca Model adlarının yerine primaryjoin tanımlarken Table adlarını kullanmalısınız. Bunun yerine

# Define relationships 
publish_user = relationship('User', backref = backref('pages', order_by = id), 
    primaryjoin = "Page.publishing_user_id == User.id") 
edit_user = relationship('User', 
    primaryjoin = "Page.last_edit_user_id == User.id") 

Kullanım:

# Define relationships 
publish_user = relationship('User', backref = backref('pages', order_by = id), 
    primaryjoin = "pages.publishing_user_id == users.id") 
edit_user = relationship('User', 
    primaryjoin = "pages.last_edit_user_id == users.id")