2013-08-07 01:52:18 +00:00
|
|
|
Models
|
|
|
|
|
======
|
|
|
|
|
|
|
|
|
|
TimeFramedModel
|
|
|
|
|
---------------
|
|
|
|
|
|
|
|
|
|
An abstract base class for any model that expresses a time-range. Adds
|
2019-03-20 09:07:00 +00:00
|
|
|
``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.
|
2013-08-07 01:52:18 +00:00
|
|
|
|
2019-03-20 09:07:00 +00:00
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
|
|
from model_utils.models import TimeFramedModel
|
|
|
|
|
from datetime import datetime, timedelta
|
|
|
|
|
class Post(TimeFramedModel):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
p = Post()
|
|
|
|
|
p.start = datetime.utcnow() - timedelta(days=1)
|
|
|
|
|
p.end = datetime.utcnow() + timedelta(days=7)
|
|
|
|
|
p.save()
|
|
|
|
|
|
|
|
|
|
# this query will return the above Post instance:
|
|
|
|
|
Post.timeframed.all()
|
|
|
|
|
|
|
|
|
|
p.start = None
|
|
|
|
|
p.end = None
|
|
|
|
|
p.save()
|
|
|
|
|
|
|
|
|
|
# this query will also return the above Post instance, because
|
|
|
|
|
# the `start` and/or `end` are NULL.
|
|
|
|
|
Post.timeframed.all()
|
|
|
|
|
|
|
|
|
|
p.start = datetime.utcnow() + timedelta(days=7)
|
|
|
|
|
p.save()
|
|
|
|
|
|
|
|
|
|
# this query will NOT return our Post instance, because
|
|
|
|
|
# the start date is in the future.
|
|
|
|
|
Post.timeframed.all()
|
2013-08-07 01:52:18 +00:00
|
|
|
|
2013-12-27 10:29:42 +00:00
|
|
|
TimeStampedModel
|
|
|
|
|
----------------
|
|
|
|
|
|
|
|
|
|
This abstract base class just provides self-updating ``created`` and
|
|
|
|
|
``modified`` fields on any model that inherits from it.
|
|
|
|
|
|
|
|
|
|
|
2013-08-07 01:52:18 +00:00
|
|
|
StatusModel
|
|
|
|
|
-----------
|
|
|
|
|
|
2013-08-07 03:47:22 +00:00
|
|
|
Pulls together :ref:`StatusField`, :ref:`MonitorField` and :ref:`QueryManager`
|
2013-08-07 01:52:18 +00:00
|
|
|
into an abstract base class for any model with a "status."
|
|
|
|
|
|
2013-08-07 03:47:22 +00:00
|
|
|
Just provide a ``STATUS`` class-attribute (a :ref:`Choices` object or a
|
2013-08-07 01:52:18 +00:00
|
|
|
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:
|
|
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
a.save()
|
|
|
|
|
|
|
|
|
|
# this query will only return published articles:
|
|
|
|
|
Article.published.all()
|
2016-09-12 11:50:03 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
SoftDeletableModel
|
|
|
|
|
------------------
|
|
|
|
|
|
|
|
|
|
This abstract base class just provides field ``is_removed`` which is
|
|
|
|
|
set to True instead of removing the instance. Entities returned in
|
|
|
|
|
default manager are limited to not-deleted instances.
|
2019-02-26 16:34:20 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
UUIDModel
|
|
|
|
|
------------------
|
|
|
|
|
|
|
|
|
|
This abstract base class provides ``id`` field on any model that inherits from it
|
|
|
|
|
which will be the primary key.
|
|
|
|
|
|
2019-08-20 10:09:41 +00:00
|
|
|
If you dont want to set ``id`` as primary key or change the field name, you can be override it
|
|
|
|
|
with our `UUIDField`_
|
2019-02-26 17:10:42 +00:00
|
|
|
|
2019-02-26 16:34:20 +00:00
|
|
|
Also you can override the default uuid version. Versions 1,3,4 and 5 are now supported.
|
|
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
|
|
from model_utils.models import UUIDModel
|
|
|
|
|
|
|
|
|
|
class MyAppModel(UUIDModel):
|
|
|
|
|
pass
|
|
|
|
|
|
2019-02-26 17:10:42 +00:00
|
|
|
|
2019-02-26 17:12:06 +00:00
|
|
|
.. _`UUIDField`: https://github.com/jazzband/django-model-utils/blob/master/docs/fields.rst#uuidfield
|
2017-07-10 12:35:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
SaveSignalHandlingModel
|
|
|
|
|
-----------------------
|
|
|
|
|
|
|
|
|
|
An abstract base class model to pass a parameter ``signals_to_disable``
|
|
|
|
|
to ``save`` method in order to disable signals
|
|
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
|
|
from model_utils.models import SaveSignalHandlingModel
|
|
|
|
|
|
|
|
|
|
class SaveSignalTestModel(SaveSignalHandlingModel):
|
|
|
|
|
name = models.CharField(max_length=20)
|
|
|
|
|
|
|
|
|
|
obj = SaveSignalTestModel(name='Test')
|
|
|
|
|
# Note: If you use `Model.objects.create`, the signals can't be disabled
|
|
|
|
|
obj.save(signals_to_disable=['pre_save'] # disable `pre_save` signal
|