4

저는 이것에 약간의 시간을 할애하여 서클에서 뛰어 다니며 계속 뛰어 다니므로 전문가가 될 것이라고 생각했습니다!플라스크 SQLAlchemy - 함께 3 개의 클래스 맵핑이 필요합니다.

Flask 0.9SQLAlchemy 0.7.9을 사용하여 갤러리 컬렉션이있는 갤러리 페이지를 만들려고합니다. 각 갤러리에는 하위 갤러리 모음이 있으며 각 하위 갤러리에는 사진 모음이 있습니다.

class Gallery(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(64)) 
    subgals = db.relationship('SubGallery', backref='author', lazy='dynamic') 

    def __repr__(self): 
     return '<Gallery - %r>' % (self.title) 


class SubGallery(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(64)) 
    photos = db.relationship('Photo', backref='author', lazy='dynamic') 
    gallery_id = db.Column(db.Integer, db.ForeignKey('gallery.id')) 

    def __repr__(self): 
     return '<Gallery - %r>' % (self.title) 


class Photo(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(64)) 
    href = db.Column(db.String(128)) 
    subgallery_id = db.Column(db.Integer, db.ForeignKey('subgallery.id')) 

    def __repr__(self): 
     return '<Photo - %r>' % (self.title) 

를이 오류를 반환 : 명확하게 아래에 표시 내 첫 번째 시도가 작동하지 않습니다 내가 다른 관계 구성을 연구했습니다

sqlalchemy.exc.ArgumentError: Could not determine join condition between parent/child tables on relationship SubGallery.photos. Specify a 'primaryjoin' expression. If 'secondary' is present, 'secondaryjoin' is needed as well. 

하지만 필요한 100 % 확실하지 않다. 내 직감은 내가 Adjacency Relationship이 필요하다고 말해 주지만 나는 그걸로 아주 멀리 할 수 ​​없었다. 나는 많은 매핑을 시도했지만 3 가지 클래스를 함께 매핑하는 방법을 많이 보지 못했습니다.

여러분 모두가 제공해야 할 모든 의견과 통찰력에 감사 드리며 감사합니다 !!

답변

3

데이터베이스가 올바르게 설정되어 있다고 생각하면 일대 다 관계가 두 개인 것으로 생각됩니다.

SQLAlchemy의 "could not determined ..."오류는 모델에 하위 갤러리와 사진 테이블 간의 관계에 대한 조인 조건을 파악하기위한 SQLAlchemy에 대한 정보가 충분하지 않다는 것을 말하는 것입니다. .

SQLAlchemy는 이름 지정 방식에서 많은 것을 추측하려고합니다. 일관성을 기대합니다. 이 경우에는 낙타의 사용으로 인해 필요한 것을 찾지 못한다고 생각합니다 SubGallery.

오류 메시지에서 알 수 있듯이 primaryjoin 인수를 관계에 추가하면 SQLAlchemy가 행복해지며 그렇지 않으면 SQLAlchemy가 자체적으로 알아낼 수 있도록 이름을 변경할 수 있습니다.

SubGallery의 이름을 'Subgallery`로 변경하여 정의를 수정했는데 제대로 작동하는 것 같습니다. 다음은 수정 된 모델입니다 :

class Gallery(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(64)) 
    subgals = db.relationship('Subgallery', backref='author', lazy='dynamic') 

    def __repr__(self): 
     return '<Gallery - %r>' % (self.title) 


class Subgallery(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(64)) 
    photos = db.relationship('Photo', backref='author', lazy='dynamic') 
    gallery_id = db.Column(db.Integer, db.ForeignKey('gallery.id')) 

    def __repr__(self): 
     return '<Gallery - %r>' % (self.title) 


class Photo(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(64)) 
    href = db.Column(db.String(128)) 
    subgallery_id = db.Column(db.Integer, db.ForeignKey('subgallery.id')) 

    def __repr__(self): 
     return '<Photo - %r>' % (self.title) 

그리고 관계가 작동하고 있는지 확인하기 위해이 작은 신속하고 더러운 테스트 스크립트를 사용했습니다 :

db.create_all() 
g = Gallery(title = "a") 
db.session.add(g) 
db.session.commit() 
sg = Subgallery(title = "a1", author = g) 
db.session.add(sg) 
db.session.commit() 
p = Photo(title = "a1p", href="href", author = sg) 
db.session.add(p) 
db.session.commit() 
for subgal in g.subgals.all(): 
    print subgal 
    print subgal.author 
    for photo in subgal.photos.all(): 
     print photo 
     print photo.author 
+0

예! 정말 고맙습니다! 매력처럼 일했다 : D – rogueSF

관련 문제