The Model API

Defining a Model

A Model describes a single table inside DynamoDB. Its instances describe records from this table. As mentioned in PynamoDB’s documentation, The most powerful feature of PynamoDB is the Model API.

You start using it by defining a model class that inherits from flask_pynamo.PynamoDB.Model. Then, you add attributes to the model that inherit from pynamodb.attributes.Attribute.

from pynamodb.attributes import UnicodeAttribute, BooleanAttribute

class Todo(db.Model):
    class Meta:
        table_name = "todo"

    id = UnicodeAttribute(hash_key=True)
    name = UnicodeAttribute()
    description = UnicodeAttribute()
    done = BooleanAttribute(defult=False)

All DynamoDB tables have a hash key, and you must specify which attribute is the hash key for each Model you define.

Creating New Items

For creating the table, use Model.create_table class method. In our case, we should use Todo.create_table.

To create a new record in the table, create a new instance, and call to the save method. The first two positional arguments are the hash_key and the range_key.

from uuid import uuid4

todo = Todo(str(uuid4()), name="my todo", description="my first todo!")
todo.save()

Getting Existing Items

To retrieve an existing item in your table, you can do that with get. If the item does not exist, Todo.DoesNotExist will be raised.

todo = Todo.get('my_todo_id')

You can also use get_or_404, so if the item does not exist the function will call to abort(404).

In addition, you can use first_or_404 to get the first item from the table. If the table is empty, it function will call to abort(404).