4 votes

Flask SQLAlchemy - Besoin d'aide pour mapper 3 classes ensemble

J'ai passé un certain temps sur cette question et je tourne en rond, sans résultat, alors je me suis dit que je devais m'adresser aux experts !

Utilisation de Flask 0.9 y SQLAlchemy 0.7.9 J'essaie de créer une page de galerie qui contient une collection de galeries. Chaque galerie a une collection de sous-galeries et chaque sous-galerie a une collection de photos. Ma première tentative, illustrée ci-dessous, ne fonctionne manifestement pas :

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)

et renvoie cette erreur :

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.

J'ai fait des recherches sur les configurations de relations alternatives mais je ne suis pas sûr à 100% de ce dont j'ai besoin. Mon instinct me dit que j'ai besoin d'une Adjacency Relationship mais je n'ai pas été capable d'aller très loin avec ça. J'ai tenté un mappage de plusieurs à plusieurs, mais je n'ai pas vu beaucoup de matériel pour mapper 3 classes ensemble.

J'apprécie VRAIMENT toute contribution et tout aperçu que vous avez à offrir à ce sujet et merci !

3voto

Miguel Points 15459

Je pense que votre base de données est correctement configurée, vous avez deux relations de type "one-to-many" et cela semble correct.

L'erreur "could not determine..." de SQLAlchemy indique simplement que votre modèle ne contient pas suffisamment d'informations pour que SQLAlchemy puisse déterminer la condition de jointure pour la relation entre la sous-galerie et les tables de photos.

SQLAlchemy essaie de deviner beaucoup de choses à partir de la façon dont vous nommez les choses, elle attend de la cohérence. Je pense que dans ce cas, elle ne trouve pas ce dont elle a besoin en raison de l'utilisation de la casse camel. SubGallery .

Vous pourriez, comme le suggère le message d'erreur, ajouter une mention explicite primaryjoin à la relation et SQLAlchemy sera heureuse, ou bien vous pouvez changer vos noms pour aider SQLAlchemy à comprendre par elle-même.

J'ai modifié vos définitions en renommant SubGallery à "Subgallery" et cela semble fonctionner. Voici les modèles modifiés :

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)

Et j'ai utilisé ce petit test rapide et sale script pour m'assurer que les relations fonctionnaient :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X