Skip to main content

In depth: Item model

tip

A Model is a representation of what our application deals with internally. Whenever two parts of our application communicate with one another, they'll do so mainly by using Models.

Code for models/item.py

from db import db


class ItemModel(db.Model):
__tablename__ = "items"

id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
price = db.Column(db.Float(precision=2))

store_id = db.Column(db.Integer, db.ForeignKey("stores.id"))
store = db.relationship("StoreModel")

def __init__(self, name, price, store_id):
self.name = name
self.price = price
self.store_id = store_id

def json(self):
return {
"id": self.id,
"name": self.name,
"price": self.price,
"store_id": self.store_id,
}

@classmethod
def find_by_name(cls, name):
return cls.query.filter_by(name=name).first()

@classmethod
def find_all(cls):
return cls.query.all()

def save_to_db(self):
db.session.add(self)
db.session.commit()

def delete_from_db(self):
db.session.delete(self)
db.session.commit()

The Models in our application can be boiled down to three things:

  • They store some data for use within our application. This is what is defined in the __init__ method—in case of the ItemModel that is the name, price, and store_id.
  • They define what columns they map to in our database. Often this includes all the parameters of the __init__ method, but can also include more (such as the id column, which is auto-incrementing and generated by our database).
  • It contains a few methods that allow us to interact with the database more easily.

ItemModel methods

Searching for an item

Searching for an item is made easy because the ItemModel is a SQLAlchemy Model, so we can use Item.query to interact with the table of items in our database.

For example, to find a specific item we define the find_by_name method in the model, which does this:

@classmethod
def find_by_name(cls, name: str) -> "ItemModel":
return cls.query.filter_by(name=name).first()

From any other part of our application, we can then find an item in the database with that method:

ItemModel.find_by_name("chair")

And we would retrieve an item where the name column is "chair".

Getting all items from the database

To retrieve all items from the database, we can use:

ItemModel.find_all()

Saving an item to the database

To save an item to the database, we must first create an ItemModel object, and then save it to the current database session:

my_item = ItemModel(name="Chair", price=15.99, store_id=1)
db.session.add(my_item)
db.session.commit()

But since the ItemModel already has a method that adds itself to the session and commits the connection, we can use that:

my_item = ItemModel(name="Chair", price=15.99, store_id=1)
my_item.save_to_db()

Deleting an item from the database

In a similar way to adding an item to the database, we can remove an item from the database session and then commit the connection:

my_item = ItemModel.find_by_name("Chair")
my_item.delete_from_db()

Returning an item to our client via the API

Normally REST APIs receive data and respond with data in JSON format (read What is JSON?). Our API is no different, so when we want to give a client data about an item, we must first convert it to JSON.

Because JSON is so similar to Python dictionaries, Flask-RESTful will convert from a Python dictionary into JSON for us automatically if it can. All we have to do to respond with JSON is give Flask-RESTful a dictionary with the data we want to send back.

That's what the ItemModel.json method does: turn the data stored in the object into a Python dictionary.

my_item = ItemModel.find_by_name("Chair")
return my_item.json()