skip to Main Content

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


  1. Chosen as BEST ANSWER

    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:

    @dataclass
    class QrRecord(db.Model):
      id: str = db.Column(db.String(256), primary_key=True)
      name: str = db.Column(db.String(128), nullable=False)
      date: datetime = db.Column(db.Date, nullable=False)
      qrType: str = db.Column(db.String(128), nullable=False)
      count: int = db.Column(db.Integer, nullable=False)
    
    @app.route("/qr", methods=["GET"])
    def qr_get():
      tasks: list = QrRecord.query.order_by(QrRecord.date).all()
      return jsonify(tasks)
    

  2. 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’s toJson() return value, then adding it to the list. Then, you should be able to simply return the list.

    @app.route("/qr", methods=["GET"])
    def qr_get():
      tasks = []
      for record in QrRecord.query.order_by(QrRecord.date).all():
        tasks.append(record.toJson())
      return tasks
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search