We use filter and filter_by to find specific data in a database easily.
Querying with filter and filter_by in Flask
query.filter(condition)
query.filter_by(attribute=value)filter lets you write detailed conditions using expressions.
filter_by is simpler and uses keyword arguments for equality checks.
User.query.filter(User.age > 20).all()
User.query.filter_by(name='Alice').first()Post.query.filter(Post.title.like('%Flask%')).all()
This example creates a simple user table in memory, adds three users, and then shows how to use filter and filter_by to find users by age and name.
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:' db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) age = db.Column(db.Integer) with app.app_context(): db.create_all() db.session.add_all([ User(name='Alice', age=30), User(name='Bob', age=20), User(name='Charlie', age=25) ]) db.session.commit() # Using filter to find users older than 21 users_over_21 = User.query.filter(User.age > 21).all() print('Users older than 21:') for user in users_over_21: print(f'{user.name} ({user.age})') # Using filter_by to find user named Bob bob = User.query.filter_by(name='Bob').first() print('\nUser named Bob:') print(f'{bob.name} ({bob.age})')
filter accepts complex conditions like greater than, less than, or like.
filter_by only works with simple equality checks using keyword arguments.
Always call .all() or .first() to get results from the query.
filter is for detailed conditions using expressions.
filter_by is simpler for checking if fields equal values.
Use these to find exactly the data you want from your database.
Practice
filter and filter_by in Flask querying?Solution
Step 1: Understand
filterusagefilteraccepts expressions likeUser.age > 20, allowing detailed conditions.Step 2: Understand
filter_byusagefilter_byuses simple keyword arguments likefilter_by(name='John')for equality checks.Final Answer:
filterallows complex expressions;filter_byuses simple keyword arguments. -> Option CQuick Check:
filter = complex, filter_by = simple keyword [OK]
- Thinking filter_by supports complex expressions
- Confusing filter_by with filter in syntax
- Assuming both methods behave identically
filter_by?Solution
Step 1: Check
filter_bysyntaxfilter_byaccepts keyword arguments likeage=30, not expressions or strings.Step 2: Identify correct usage
OnlyUser.query.filter_by(age=30).all()uses correct keyword argument syntax.Final Answer:
User.query.filter_by(age=30).all() -> Option BQuick Check:
filter_by uses keyword arguments [OK]
- Passing expressions or strings to filter_by
- Using comparison operators inside filter_by
- Confusing filter_by with filter syntax
User with fields name and age, what will this query return?users = User.query.filter(User.age > 25).filter_by(name='Alice').all()
Solution
Step 1: Understand chaining filters
Chainingfilterandfilter_bycombines conditions with AND logic.Step 2: Analyze conditions
filter(User.age > 25)filters age > 25,filter_by(name='Alice')filters name = 'Alice'. Both apply together.Final Answer:
All users named Alice older than 25 -> Option AQuick Check:
Chained filters combine conditions [OK]
- Thinking filter_by overrides filter
- Assuming only one filter applies
- Believing mixing filter and filter_by causes error
users = User.query.filter_by(User.age > 20).all()
Solution
Step 1: Check filter_by argument type
filter_byonly accepts keyword arguments likeage=20, not expressions.Step 2: Identify error in usage
PassingUser.age > 20is an expression, invalid forfilter_by.Final Answer:
filter_by does not accept expressions, only keyword arguments -> Option DQuick Check:
filter_by = keyword args only [OK]
- Passing expressions to filter_by
- Confusing filter_by with filter syntax
- Expecting filter_by to parse conditions
name starts with 'J' and are younger than 40. Which query correctly uses filter and filter_by together?Solution
Step 1: Use
Checking if name starts with 'J' requiresfilterfor complex conditionslike('J%'), which is an expression needingfilter.Step 2: Use
Age < 40 is also an expression, sofilterfor age less than 40filteris needed again.filter_bycannot handle expressions.Step 3: Verify option correctness
User.query.filter(User.name.like('J%')).filter(User.age < 40).all() usesfiltertwice with correct expressions. Others misusefilter_byor syntax.Final Answer:
User.query.filter(User.name.like('J%')).filter(User.age < 40).all() -> Option AQuick Check:
Use filter for expressions, filter_by for simple equals [OK]
- Using filter_by with expressions like like() or <
- Mixing filter_by with invalid syntax
- Assuming filter_by can handle partial matches
Ready to prove it?
Pass the test and this pattern moves unknown
