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. 🙌