An abstract base class for any model that expresses a time-range. Adds start and end nullable DateTimeFields, and provides a new timeframed manager on the subclass whose queryset pre-filters results to only include those which have a start which is not in the future, and an end which is not in the past. If either start or end is null, the manager will include it.

from model_utils.models import TimeFramedModel
from datetime import datetime, timedelta
class Post(TimeFramedModel):

p = Post()
p.start = datetime.utcnow() - timedelta(days=1)
p.end = datetime.utcnow() + timedelta(days=7)

# this query will return the above Post instance:

p.start = None
p.end = None

# this query will also return the above Post instance, because
# the `start` and/or `end` are NULL.

p.start = datetime.utcnow() + timedelta(days=7)

# this query will NOT return our Post instance, because
# the start date is in the future.


This abstract base class just provides self-updating created and modified fields on any model that inherits from it.


Pulls together StatusField, MonitorField and QueryManager into an abstract base class for any model with a “status.”

Just provide a STATUS class-attribute (a Choices object or a list of two-tuples), and your model will have a status field with those choices, a status_changed field containing the date-time the status was last changed, and a manager for each status that returns objects with that status only:

from model_utils.models import StatusModel
from model_utils import Choices

class Article(StatusModel):
    STATUS = Choices('draft', 'published')

# ...

a = Article()
a.status = Article.STATUS.published

# this save will update a.status_changed

# this query will only return published articles:


This abstract base class just provides a field is_removed which is set to True instead of removing the instance. Entities returned in manager available_objects are limited to not-deleted instances.

Note that relying on the default objects manager to filter out not-deleted instances is deprecated. objects will include deleted objects in a future release. Until then, the recommended course of action is to use the manager all_objects when you want to include all instances.


This abstract base class provides id field on any model that inherits from it which will be the primary key.

If you dont want to set id as primary key or change the field name, you can override it with our UUIDField

Also you can override the default uuid version. Versions 1,3,4 and 5 are now supported.

from model_utils.models import UUIDModel

class MyAppModel(UUIDModel):