Bird
Raised Fist0
Flaskframework~10 mins

Many-to-many relationships in Flask - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Many-to-many relationships
Define two models
↓
Create association table
↓
Add relationship fields in models
↓
Create instances
↓
Associate instances via relationship
↓
Query related data
↓
Access linked objects
This flow shows how to set up two models linked by a many-to-many relationship using an association table, then create and query linked data.
Execution Sample
Flask
from flask_sqlalchemy import SQLAlchemy

from sqlalchemy.orm import relationship

db = SQLAlchemy()

association = db.Table('association',
    db.Column('left_id', db.Integer, db.ForeignKey('left.id')),
    db.Column('right_id', db.Integer, db.ForeignKey('right.id'))
)
This code defines an association table to link two models in a many-to-many relationship.
Execution Table
StepActionData Created/ModifiedResult/State
1Define Left and Right modelsLeft and Right classes with id fieldsModels ready for association
2Create association table 'association'Table with left_id and right_id columnsAssociation table links Left and Right
3Add relationship fields to Left and RightLeft.related = relationship(Right, secondary=association, back_populates='left_set') Right.left_set = relationship(Left, secondary=association, back_populates='related')Models linked via association
4Create Left instance l1l1 = Left()l1 created, no relations yet
5Create Right instances r1, r2r1 = Right(), r2 = Right()r1 and r2 created, no relations yet
6Associate l1 with r1 and r2l1.related.append(r1), l1.related.append(r2)l1 linked to r1 and r2
7Commit sessiondb.session.add(l1), db.session.add(r1), db.session.add(r2), db.session.commit()Data saved with links
8Query l1.relatedl1.relatedReturns [r1, r2] showing many-to-many link
9Query r1.left_setr1.left_setReturns [l1] showing reverse link
10EndNo further actionsExecution complete
💡 All objects created and linked; queries confirm many-to-many relationships.
Variable Tracker
VariableStartAfter Step 4After Step 5After Step 6After Step 7Final
l1NoneLeft instance createdLeft instance createdLinked to r1, r2Persisted in DBLinked to r1, r2
r1NoneNoneRight instance createdLinked to l1Persisted in DBLinked to l1
r2NoneNoneRight instance createdLinked to l1Persisted in DBLinked to l1
Key Moments - 3 Insights
Why do we need an association table for many-to-many relationships?
Because many-to-many means each item in one model can link to many in the other, and vice versa. The association table stores these links as pairs. See Step 2 in execution_table.
How does adding items to the relationship list link objects?
Appending objects to the relationship list adds entries to the association table behind the scenes, creating the link. See Step 6 in execution_table where l1.related.append(r1) links l1 and r1.
How do we access related objects from either side?
We use the relationship attribute on each model. For example, l1.related returns all Right objects linked to l1. See Steps 8 and 9 in execution_table.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, at which step are the Right instances created?
AStep 4
BStep 6
CStep 5
DStep 7
💡 Hint
Check the 'Action' column for creation of Right instances.
According to variable_tracker, what is the state of l1 after Step 6?
Al1 is linked to r1 and r2
Bl1 is deleted
Cl1 is not linked to any Right instances
Dl1 is linked only to r1
💡 Hint
Look at the 'After Step 6' column for variable l1.
If we skip Step 7 (commit), what happens when querying l1.related?
AIt returns an empty list
BIt returns the linked Right instances anyway
CIt causes an error
DIt returns only one linked instance
💡 Hint
Consider that objects are linked in memory before commit; see Step 6 and 8.
Concept Snapshot
Many-to-many relationships in Flask-SQLAlchemy:
- Use an association table with ForeignKeys to link two models.
- Define relationship() in both models with secondary=association_table and back_populates.
- Append related objects to link them.
- Commit to save links in the database.
- Access related objects via relationship attributes.
Full Transcript
This lesson shows how to create many-to-many relationships in Flask using SQLAlchemy. First, define two models representing the entities you want to link. Then create an association table with foreign keys to both models. Add relationship fields in each model using the association table as secondary and back_populates to enable bidirectional access. Create instances of each model and link them by appending related objects to the relationship list. Commit the session to save changes. You can then query related objects from either side. The execution table traces each step from model definition to querying linked data. The variable tracker shows how instances and their links change over time. Key moments clarify why the association table is needed, how linking works, and how to access related objects. The quiz tests understanding of creation steps, variable states, and effects of committing. This approach helps manage complex many-to-many data connections in Flask apps.

Practice

(1/5)
1. What is the main purpose of using an association table in a many-to-many relationship in Flask SQLAlchemy?
easy
A. To link two tables that can have multiple related records each
B. To store user login information securely
C. To create a one-to-one relationship between models
D. To optimize database queries by caching results

Solution

  1. Step 1: Understand many-to-many relationships

    Many-to-many means each record in one table can relate to many records in another table, and vice versa.
  2. Step 2: Role of association table

    An association table connects these two tables by holding pairs of related record IDs, enabling the many-to-many link.
  3. Final Answer:

    To link two tables that can have multiple related records each -> Option A
  4. Quick Check:

    Association table = link many-to-many tables [OK]
Hint: Association tables connect two models with many links [OK]
Common Mistakes:
  • Thinking association tables store user credentials
  • Confusing many-to-many with one-to-one relationships
  • Assuming association tables optimize queries automatically
2. Which of the following is the correct way to define an association table in Flask SQLAlchemy?
easy
A. association = db.Model('association', db.Column('left_id', db.Integer), db.Column('right_id', db.Integer))
B. association = db.Model('association', db.ForeignKey('left.id'), db.ForeignKey('right.id'))
C. association = db.Table('association', db.Column('left_id', db.String), db.Column('right_id', db.String))
D. association = db.Table('association', db.Column('left_id', db.Integer, db.ForeignKey('left.id')), db.Column('right_id', db.Integer, db.ForeignKey('right.id')))

Solution

  1. Step 1: Identify correct association table syntax

    Association tables use db.Table with columns having foreign keys to related tables.
  2. Step 2: Check options for correct use of db.Table and foreign keys

    association = db.Table('association', db.Column('left_id', db.Integer, db.ForeignKey('left.id')), db.Column('right_id', db.Integer, db.ForeignKey('right.id'))) correctly uses db.Table and defines columns with foreign keys to 'left.id' and 'right.id'.
  3. Final Answer:

    association = db.Table('association', db.Column('left_id', db.Integer, db.ForeignKey('left.id')), db.Column('right_id', db.Integer, db.ForeignKey('right.id'))) -> Option D
  4. Quick Check:

    Association table = db.Table + foreign keys [OK]
Hint: Use db.Table with foreign keys for association tables [OK]
Common Mistakes:
  • Using db.Model instead of db.Table for association tables
  • Missing foreign key constraints in columns
  • Using wrong data types like String for IDs
3. Given the following models, what will print(user.groups[0].name) output?
association = db.Table('association',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('group_id', db.Integer, db.ForeignKey('group.id'))
)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    groups = db.relationship('Group', secondary=association, back_populates='users')

class Group(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    users = db.relationship('User', secondary=association, back_populates='groups')

user = User(name='Alice')
group = Group(name='Admins')
user.groups.append(group)
print(user.groups[0].name)
medium
A. None
B. Admins
C. Alice
D. Error: AttributeError

Solution

  1. Step 1: Understand relationship setup

    User and Group are linked many-to-many via association table. User.groups holds Group objects.
  2. Step 2: Analyze code behavior

    User 'Alice' has 'Admins' group appended. Accessing user.groups[0].name returns 'Admins'.
  3. Final Answer:

    Admins -> Option B
  4. Quick Check:

    user.groups[0].name = 'Admins' [OK]
Hint: Access related objects via relationship lists [OK]
Common Mistakes:
  • Confusing user name with group name
  • Expecting None if not committed to DB
  • Assuming error due to missing session commit
4. Identify the error in this many-to-many relationship setup:
association = db.Table('association',
    db.Column('user_id', db.Integer),
    db.Column('group_id', db.Integer)
)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    groups = db.relationship('Group', secondary=association, back_populates='users')

class Group(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    users = db.relationship('User', secondary=association, back_populates='groups')
medium
A. Incorrect use of back_populates attribute
B. Missing primary key in User model
C. Missing foreign key constraints in association table columns
D. Using db.Model instead of db.Table for association

Solution

  1. Step 1: Check association table columns

    Columns lack foreign key constraints linking to User and Group tables.
  2. Step 2: Importance of foreign keys

    Foreign keys are required to enforce relationships and enable SQLAlchemy to join tables properly.
  3. Final Answer:

    Missing foreign key constraints in association table columns -> Option C
  4. Quick Check:

    Foreign keys required in association table [OK]
Hint: Always add foreign keys in association tables [OK]
Common Mistakes:
  • Omitting foreign keys in association table
  • Confusing back_populates usage
  • Thinking primary key is missing in User model
5. You want to add a role attribute to the association between User and Group models to store the user's role in each group. Which approach correctly implements this in Flask SQLAlchemy?
hard
A. Create a new model class for the association with user_id, group_id, and role columns
B. Add a role column to the association table defined with db.Table
C. Add role as a property in the User model
D. Add role as a property in the Group model

Solution

  1. Step 1: Understand limitation of db.Table

    db.Table is a simple table without a model class, so it cannot hold extra attributes like 'role'.
  2. Step 2: Use association object pattern

    Create a new model class representing the association with foreign keys and extra columns like 'role'. This allows storing additional data per relationship.
  3. Final Answer:

    Create a new model class for the association with user_id, group_id, and role columns -> Option A
  4. Quick Check:

    Extra data in many-to-many needs association model class [OK]
Hint: Use association model class for extra fields in many-to-many [OK]
Common Mistakes:
  • Trying to add extra columns to db.Table association
  • Adding role to User or Group instead of association
  • Not using a model class for complex associations
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard