2017-05-29 1 views
0

J'essaie d'apprendre des relations dans flask_sqlalchemy mais j'ai vraiment du mal à faire fonctionner le code. Tout d'abord il y a un manque de bons tutoriels sur ce sujet, mais j'ai quand même joint des bribes d'information pour écrire du code mais je n'obtiens pas les résultats attendus. Pouvez-vous expliquer ce que je fais de mal dans ce code?Comprendre une ou plusieurs relations dans flask_sqlalchemy

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgres://<my_user>:<my_password>@localhost/flask_apps' 
db = SQLAlchemy(app) 


class Universe(db.Model): 
    __tablename__ = 'universe' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(30)) 
    hero = db.relationship('Characters', backref='u_name', lazy='dynamic') 


class Characters(db.Model): 
    __tablename__= 'characters' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(50)) 
    uni = db.Column(db.Integer, db.ForeignKey('universe.id')) 

if __name__ == '__main__': 
    db.drop_all() 
    db.create_all() 
    dc = Universe(name='DC') 
    marvel = Universe(name='Marvel') 
    db.session.add(dc) 
    db.session.add(marvel) 
    db.session.commit() 
    flash = Characters(name='Flash', u_name=dc) 
    batman = Characters(name='Batman', u_name=dc) 
    arrow = Characters(name='Arrow', u_name=dc) 
    ironman = Characters(name='IronMan', u_name=marvel) 
    thor = Characters(name='Thor', u_name=marvel) 
    db.session.add(flash) 
    db.session.add(ironman) 
    db.session.commit() 

    u = Universe.query.filter_by(name='DC').first() 
    print(u.hero) 

Et c'est la sortie que j'obtiens.

SELECT characters.id AS characters_id, characters.name AS characters_name, characters.uni AS characters_uni 
FROM characters 
WHERE %(param_1)s = characters.uni 

Process finished with exit code 0 

Je m'attends à obtenir les noms de caractères qui appartiennent à cet univers particulier. Pas vraiment sûr de ce qui me manque ici.

Répondre

0

J'ai été en mesure de résoudre ce problème, le problème était l'interprétation erronée de hero comme attribut à valeur unique qui est plutôt une collection. Donc, en utilisant la requête ci-dessous fonctionne.

u = Universe.query.filter_by(name='DC').first() 
    for item in u.hero[:]: 
     print(item.name)