flask-peewee ships with several useful utilities. If you’re coming from the django world, some of these functions may look familiar to you.

Getting objects


Provides a handy way of getting an object or 404ing if not found, useful for urls that match based on ID.

def blog_detail(title):
    blog = get_object_or_404(Blog.select().where(Blog.active==True), Blog.title==title)
    return render_template('blog/detail.html', blog=blog)


Wraps the given query and handles pagination automatically. Pagination defaults to 20 but can be changed by passing in paginate_by=XX.

def blog_list():
    active = Blog.select().where(Blog.active==True)
    return object_list('blog/index.html', active)
<!-- template -->
{% for blog in object_list %}
  {# render the blog here #}
{% endfor %}

{% if page > 1 %}
  <a href="./?page={{ page - 1 }}">Prev</a>
{% endif %}
{% if page < pagination.get_pages() %}
  <a href="./?page={{ page + 1 }}">Next</a>
{% endif %}


A wrapper around a query (or model class) that handles pagination.


query = Blog.select().where(Blog.active==True)
pq = PaginatedQuery(query)

# assume url was /?page=3
obj_list = pq.get_list()  # returns 3rd page of results

pq.get_page() # returns "3"

pq.get_pages() # returns total objects / objects-per-page



Convert a string into something suitable for use as part of a URL, e.g. “This is a url” becomes “this-is-a-url”

from flask_peewee.utils import slugify

class Blog(db.Model):
    title = CharField()
    slug = CharField()

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Blog, self).save(*args, **kwargs)

Create a salted hash for the given plain-text password

check_password(raw_password, enc_password)

Compare a plain-text password against a salted/hashed password