Aller au contenu principal

3 formations sont désormais disponibles : Python, Flask et JS.

Aller au contenu principal

Les données ne vivent pas seules. Un Utilisateur écrit plusieurs Articles (One-to-Many).

Définir la relation

Modifions nos modèles.

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    
    # RELATION : Un User a plusieurs Posts.
    # 'Post' est le nom de l'autre classe.
    # backref='author' crée une propriété virtuelle 'author' dans la classe Post.
    # lazy=True signifie que Flask chargera les posts seulement quand on les demandera.
    posts = db.relationship('Post', backref='author', lazy=True)

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.Text, nullable=False)
    
    # CLÉ ÉTRANGÈRE : Lien vers la table 'user'.
    # Note le minuscule 'user.id' car on fait référence au nom de la TABLE, pas de la classe.
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

Utiliser la relation

C'est magique.

Créer un post lié à un user

moi = User.query.first()
post = Post(title='Mon premier post', content='Bla bla', author=moi) 
# Note qu'on utilise 'author=moi' grâce au backref !
# On aurait aussi pu faire 'user_id=moi.id'

db.session.add(post)
db.session.commit()

Accéder aux données liées

# Depuis l'utilisateur
print(moi.posts) 
# Affiche [<Post 'Mon premier post'>, <Post 'Autre post'>...]

# Depuis le post
mon_post = Post.query.first()
print(mon_post.author.username) 
# Affiche le nom de l'auteur

L'ORM gère toutes les jointures SQL complexes pour toi. 🙌