Skip to content

One-to-Many Relationships

A one-to-many relationship means:

  • one parent row relates to many child rows

Example:

  • one UserUser has many PostPosts

Models

class User(db.Model):
    __tablename__ = "users"
 
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
 
    posts = db.relationship("Post", back_populates="author", lazy=True)
 
 
class Post(db.Model):
    __tablename__ = "posts"
 
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200), nullable=False)
 
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
    author = db.relationship("User", back_populates="posts")
class User(db.Model):
    __tablename__ = "users"
 
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
 
    posts = db.relationship("Post", back_populates="author", lazy=True)
 
 
class Post(db.Model):
    __tablename__ = "posts"
 
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200), nullable=False)
 
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
    author = db.relationship("User", back_populates="posts")

How to use it

user = User.query.first()
for post in user.posts:
    print(post.title)
user = User.query.first()
for post in user.posts:
    print(post.title)

lazy loading

  • lazy=Truelazy=True means posts are loaded when accessed

Be careful in loops (can cause N+1 queries).

You can optimize with eager loading later.

If this helped you, consider buying me a coffee ☕

Buy me a coffee

Was this page helpful?

Let us know how we did