Outils pour utilisateurs

Outils du site


dev:python:flask:flask-sqlalchemy:relation_one-to-many

Ceci est une ancienne révision du document !


Flask-SQLAlchemy : relation one-to-many

Quelques notes à propos de l'implémentation d'une relation un à plusieurs (one to many) avec l'extension Flask-SQLAlchemy.

Pour illustrer le concept on prend un exemple rudimentaire :

MCD via diagramme UML

  • Un magasin (Shop) vend un ou plusieurs produits (Product);
  • Un produit est vendu par un seul magasin.

Implémentation

Ci-dessous l'application Flask minimaliste implémentant les deux classes du modèle et la relation one-to-many.

app.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
 
db = SQLAlchemy()
 
 
class Shop(db.Model):
    __tablename__ = 'shops'
    id = db.Column(db.Integer, primary_key=True, index=True)
    name = db.Column(db.String(80), unique=True, index=True)
 
    products = db.relationship("Product", back_populates="shop", lazy='dynamic')
 
    def add_product(self, product):
        if self.id is None :
            # Le magasin doit exister en base avant d'ajouter un produit
            db.session.add(self)
            db.session.commit()
 
        product.shop_id = self.id
        db.session.add(product)
        db.session.commit()
 
 
class Product(db.Model):
    __tablename__ = 'products'
    id = db.Column(db.Integer, primary_key=True, index=True)
    name = db.Column(db.String(80), unique=True, index=True)
    price = db.Column(db.Float(precision=2))
 
    shop_id = db.Column(db.Integer, db.ForeignKey('shops.id'), unique=False, nullable=False)
 
    shop = db.relationship("Shop", back_populates="products")
 
 
 
# Création de l'application
# On utilise la variable __name__ pour définir le nom du module courant
# comme root applicatif pour notre application flask
app = Flask(__name__)
 
# Le chemin vers la base SQLite est relatif au dossier de l'application flask
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///database.db"
 
# Initialiser l'application Flask par l'intermédiaire de l'extension
db.init_app(app)

Test et utlisation

Pour tester l'implémentation, on peut lancer l'application flask en mode interactif :

flask shell
>>> # Afficher les références
 
 
>>> # Création de la base
 
 
>>> # Instanciation d'un magasin et de quelques produits
 
 
 
>>> # Ne récupérer que les produits dont le prix est supérieur à 30€
>>> rqt.filter(Product.price>30.0).all()
 
>>> # Utilisation de la fonction LIKE
>>> rqt.filter(Product.name.like('%Ri%')).all()

Références

dev/python/flask/flask-sqlalchemy/relation_one-to-many.1733578678.txt.gz · Dernière modification : 2024/12/07 13:37 de yoann