4

Так что я потратил некоторое время на это и продолжаю бегать по кругу и никуда не уходил, поэтому решил, что приду к специалистам!Колба SQLAlchemy - Нужна помощь Сопоставление 3 класса вместе

Использование Flask 0.9 и SQLAlchemy 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 просто говорит о том, что в вашей модели SQLAlchemy недостаточно информации, чтобы выяснить, что условие соединения для отношения между подкатегорией и таблицами фотографий ,

SQLAlchemy пытается угадывать множество вещей из того, как вы называете вещи, он ожидает согласованности. Я считаю, что в этом случае он не находит, что ему нужно, из-за вашего использования верблюжьего футляра SubGallery.

Вы можете, как следует из сообщения об ошибке, добавить аргумент explicity primaryjoin в отношение, а затем SQLAlchemy будет счастливым, иначе вы можете изменить свои имена, чтобы помочь SQLAlchemy самостоятельно разобраться.

Я изменил ваши определения, переименовав 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