Issue
I’m trying to clean up some of my Flask code. I have the following line that works:
user = User.query.filter_by(username=username).first()
But my preference is to use this so it can throw a 404. However the above code works but gives an error:
user = User.query.get_or_404(username=username)
TypeError: get_or_404() got an unexpected keyword argument ‘username’. If I try this:
user = User.query.get_or_404(username)
An error is also displayed:
[SQL: SELECT “user”.id AS user_id, “user”.username AS user_username,
“user”.email AS user_email, “user”.password_hash AS
user_password_hash, “user”.about_me AS user_about_me, “user”.last_seen
as user_last_seen, “user”.is_confirmed AS user_is_confirmed,
“user”.confirmed_on AS user_confirmed_on FROM “user” WHERE “user”.id =
%(pk_1)s] [Parameters: {‘pk_1’: ‘john’}]
How do I use this query? The error seems to be trying to enter a name as an id which apparently expects a number.
Solution
In flask-sqlalchemy, like get(pk)
, get_or_404(param)
also expects the primary key of the model inside the parameter. In your case, your username
is not the primary key of the User model.
Instead, you can use user = User.query.filter_by(username=username).first_or_404()
to get 404 if user not exists.
Answered By – MD Obaidullah Al-Faruk
Answer Checked By – Katrina (Easybugfix Volunteer)