I am working on a simple CRUD application and I can’t return an array of objects in Flask.
My db Model is like this:
class QrRecord(db.Model):
id = db.Column(db.String(256), primary_key=True)
name = db.Column(db.String(128), nullable=False)
date = db.Column(db.Date, nullable=False)
qrType = db.Column(db.String(128), nullable=False)
count = db.Column(db.Integer, nullable=False)
def toJson(self):
return jsonify(
{
"id": self.id,
"name": self.name,
"date": self.date,
"qrType": self.qrType,
"count": self.count
}
)
And I am trying to return it like so:
@app.route("/qr", methods=["GET"])
def qr_get():
tasks: list = QrRecord.query.order_by(QrRecord.date).all()
return jsonify(tasks)
The error I get is:
<title>TypeError: Object of type type is not JSON serializable
// Werkzeug Debugger</title>
When I am returning one single object as return return tasks[0].toJson()
, it works just fine. The same when I would return an array of anything else, just like return jsonify([1, 2, 3])
.
Would anybody know how to return the array of QrRecords? I feel like I have tried every solution already.
2
Answers
This answer has already been more or less answered to here: How to serialize SqlAlchemy result to JSON?
Using
@dataclass
together with statically typed params helped:The issue is that
tasks
is a list of db objects, which (as the error says) is not JSON serializable. You can solve this by iterating over each object in your query, getting it’stoJson()
return value, then adding it to the list. Then, you should be able to simply return the list.