- Add support for Python 3.13 (GH-#628)
- Add formal support for Django 5.1
- Remove MonitorField deprecation warning. None - instead of django.utils.timezone.now will be used when nullable and no default provided (GH-#599)
- Add deprecation warning for MonitorField. The default value will be None instead of django.utils.timezone.now - when nullable and without a default.
- Add Brazilian Portuguese translation (GH-#578)
- Don't use post_init signal for initialize tracker
- Make contribute_to_class() in StatusField, MonitorField and SplitField forward additional arguments to Django
- SplitField no longer accepts no_excerpt_field as a keyword argument
- Make soft argument to SoftDeletableModel.delete() keyword-only
- JoinManager and JoinManagerMixin have been deprecated;
please use
JoinQueryset.as_manager()
instead - Change SoftDeletableQuerySetMixin.delete to replicate Django's API.
- Remove JoinQueryset.get_quoted_query() by @mthuurne (GH-#618)
- Don't use post_init signal for initialize tracker by @meanmail in - (GH-#556)
- clarify docs for managers of SoftDeletableModel by @tadamcz in - (GH-#589)
- [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci in - (GH-#575)
- Language Support - Add translations for Brazilian Portuguese by @gmcrocetti in - (GH-#578)
- Remove dead init_deferred_fields method by @joecox in - (GH-#580)
- Update where ConnectionDoesNotExist is imported from by @mthuurne in - (GH-#566)
- Remove arguments from InheritanceQuerySetMixin._clone() by @mthuurne in - (GH-#567)
- Allow running tests using sqlite by @jayvdb in - (GH-#516)
- MonitorField - Change default to None when the field is nullable by @gmcrocetti in - (GH-#577)
- Explicitly re-export names from __init__ module by @mthuurne in - (GH-#591)
- Switch from freezegun to time-machine. by @adamchainz in - (GH-#510)
- USE_TZ = True by @foarsitter in - (GH-#593)
- Remove redundant definition of JoinManager from tests by @mthuurne in - (GH-#594)
- Pass reason to @skip decorator by @mthuurne in - (GH-#595)
- Resolve name clash among test models by @mthuurne in - (GH-#596)
- Remove obsolete tests.signals module by @mthuurne in - (GH-#597)
- Remove obsolete test models by @mthuurne in - (GH-#598)
- Postgresql docker container for local development by @foarsitter in - (GH-#563)
- [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci in - (GH-#602)
- Add issue-manager by @foarsitter in - (GH-#600)
- Translation files by @foarsitter in - (GH-#608)
- Add support for Python 3.11 (GH-#545)
- Add support for Python 3.12 (GH-#545)
- Drop support for Python 3.7 (GH-#545)
- Add support for Django 4.2
- Add support for Django 5.0
- Remove
SaveSignalHandlingModel
. This model used a modified copy of the internal Django method Model.save_base() and had not been updated for upstream bug fixes changes since its addition. - Add Swedish translation
- Use proper column name instead of attname (GH-#573)
- Fix ValueError when calling prefetch_related for tracked ForeignKey fields
- Confirm support for Django 4.0
- Add Spanish translation
- Add French translation
- Drop Django 1.7 workaround from select_subclasses()
- Drop support for Django < 3.2
- Drop support for Python 3.6
- Confirm support for Django 4.1
- Never released due to packaging issues.
- Add support for Django 3.2
- Drop support for Django 3.0
- Add support for Python 3.10
- Added urlsafe token field.
- Introduce context manager for FieldTracker state reset (GH-#491)
- Fix performance regression of FieldTracker on FileField subclasses on Django 3.1+ (GH-#498)
- Applied isort to codebase (Refs GH-#402)
- Fix TypeError in save when model inherits from both TimeStampModel and StatusModel. (Fixes GH-465)
Breaking changes:
- FieldTracker now marks fields as not changed after refresh_from_db respecting fields argument (GH-#404)
- FieldTracker now respects update_fields changed in overridden save() method (GH-#404)
- FieldTracker now resets states after pre_save() and not anymore save() signals, possibly altering the behaviour of overridden save() methods (GH-#404)
Other changes:
- Update InheritanceQuerySetMixin to avoid querying too much tables
- TimeStampedModel now automatically adds 'modified' field as an update_fields parameter even if it is forgotten while using save()
- Replace ugettext_lazy with gettext_lazy to satisfy Django deprecation warning
- Add available_objects manager to SoftDeletableModel and add deprecation warning to objects manager.
- StatusModel now automatically adds 'status_changed' field during save as an update_fieldsparameter when 'status' is present in it to make sure it is not forgotten.
- Update test requirements
- Move tests to GitHub Actions: https://github.com/jazzband/django-model-utils/actions
- Drop support for Django 2.1
- Add support for Python 3.9
- Add support for Django 3.1
- Added Choices.subset.
- Remove hacks for previously supported Django versions. (Fixes GH-390)
- Dropped support for Python 2.7. (Fixes GH-393)
- Dropped usage of six
- Drop support for Django 1.11
- Add support for Python 3.8
- Add support for Django 3.0
- Catch AttributeError for deferred abstract fields, fixes GH-331.
- Update documentation to explain usage of timeframed model manager, fixes GH-118
- Honor OneToOneField.parent_link=False.
- Fix handling of deferred attributes on Django 1.10+, fixes GH-278
- Fix FieldTracker.has_changed() and FieldTracker.previous() to return correct responses for deferred fields.
- Add Simplified Chinese translations.
- Update AutoLastModifiedField so that at instance creation it will always be set equal to created to make querying easier. Fixes GH-254
- Support reversed for all kinds of Choices objects, fixes GH-309
- Fix Model instance non picklable GH-330
- Fix patched save in FieldTracker
- Upgrades test requirements (pytest, pytest-django, pytest-cov) and skips tox test with Python 3.5 and Django (trunk)
- Add UUIDModel and UUIDField support.
- Update InheritanceIterable to inherit from ModelIterable instead of BaseIterable, fixes GH-277.
- Add all_objects Manager for 'SoftDeletableModel' to include soft deleted objects on queries as per issue GH-255
- Update classifiers and README via GH-306, fixes GH-305
- Support for Django 2.0 via GH-298, fixes GH-297
- Remove old travis script via GH-300
- Fix codecov and switch to py.test #301
- Drop support for Python 2.6.
- Drop support for Django 1.4, 1.5, 1.6, 1.7.
- Exclude tests from the distribution, fixes GH-258.
- Add support for Django 1.11 GH-269
- Add a new model to disable pre_save/post_save signals
- Fix infinite recursion with multiple MonitorField and defer() or only() on Django 1.10+. Thanks Romain Garrigues. Merge of GH-242, fixes GH-241.
- Fix InheritanceManager and SoftDeletableManager to respect self._queryset_class instead of hardcoding the queryset class. Merge of GH-250, fixes GH-249.
- Add mixins for SoftDeletableQuerySet and SoftDeletableManager, as stated in the the documentation.
- Fix SoftDeletableModel.delete() to use the correct database connection. Merge of GH-239.
- Added boolean keyword argument soft to SoftDeletableModel.delete() that revert to default behavior when set to False. Merge of GH-240.
- Enforced default manager in StatusModel to avoid manager order issues when using abstract models that redefine objects manager. Merge of GH-253, fixes GH-251.
- Added SoftDeletableModel abstract class, its manageer SoftDeletableManager and queryset SoftDeletableQuerySet.
- Fix issue with field tracker and deferred FileField for Django 1.10.
- Include runtests.py in sdist.
- Fix InheritanceQuerySet raising an AttributeError exception under Django 1.9.
- Django 1.10 support regressed with changes between pre-alpha and final release; 1.10 currently not supported.
- Drop support for Python 3.2.
- Add support for Django 1.10 pre-alpha.
- Track foreign keys on parent models properly when a tracker is defined on a child model. Fixes GH-214.
- Remove PassThroughManager. Use Django's built-in QuerySet.as_manager() and/or Manager.from_queryset() utilities instead.
- Add support for Django 1.9.
- Remove all translation-related automation in setup.py. Fixes GH-178 and GH-179. Thanks Joe Weiss, Matt Molyneaux, and others for the reports.
- Keep track of deferred fields on model instance instead of on FieldInstanceTracker instance. Fixes accessing deferred fields for multiple instances of a model from the same queryset. Thanks Bram Boogaard. Merge of GH-151.
- Fix Django 1.7 migrations compatibility for SplitField. Thanks ad-m. Merge of GH-157; fixes GH-156.
- Add German translations.
- Django 1.8 compatibility.
- Revert GH-130, restoring ability to access
FieldTracker
changes in overriddensave
methods orpost_save
handlers. This reopens GH-83 (inability to pickle models withFieldTracker
) until a solution can be found that doesn't break behavior otherwise. Thanks Brian May for the report. Fixes GH-143.
- ASCII-fold all non-ASCII characters in changelog; again. Argh. Apologies to those whose names are mangled by this change. It seems that distutils makes it impossible to handle non-ASCII content reliably under Python 3 in a setup.py long_description, when the system encoding may be ASCII. Thanks Brian May for the report. Fixes GH-141.
- Add support for Django's built-in migrations to
MonitorField
andStatusField
. PassThroughManager
now has support for seeing exposed methods viadir
, allowing IPython tab completion to be useful. Merge of GH-104, fixes GH-55.- Add pickle support for models using
FieldTracker
. Thanks Ondrej Slintak for the report. Thanks Matthew Schinckel for the fix. Merge of GH-130, fixes GH-83.
- Fix
get_query_set
vsget_queryset
inPassThroughManager
for Django <1.6. Fixes issues with related managers not filtering by relation properly. Thanks whop, Bojan Mihelac, Daniel Shapiro, and Matthew Schinckel for the report; Matthew for the fix. Merge of GH-121. - Fix
FieldTracker
with deferred model attributes. Thanks Michael van Tellingen. Merge of GH-115. - Fix
InheritanceManager
with self-referential FK; avoid infinite recursion. Thanks rsenkbeil. Merge of GH-114.
- ASCII-fold all non-ASCII characters in changelog. Apologies to those whose names are mangled by this change. It seems that distutils makes it impossible to handle non-ASCII content reliably under Python 3 in a setup.py long_description, when the system encoding may be ASCII. Thanks Simone Dalla for the report. Fixes GH-113.
- Fix dependency to be on "Django" rather than "django", which plays better with static PyPI mirrors. Thanks Travis Swicegood.
- Fix issue with attempt to access
__slots__
when copyingPassThroughManager
. Thanks Patryk Zawadzki. Merge of GH-105. - Improve
InheritanceManager
so any attributes added by using extra(select) will be propagated onto children. Thanks Curtis Maloney. Merge of GH-101, fixes GH-34. - Added
InheritanceManagerMixin
,InheritanceQuerySetMixin
,PassThroughManagerMixin
, andQueryManagerMixin
to allow composing their functionality with other custom manager/queryset subclasses (e.g. those in GeoDjango). Thanks Douglas Meehan!
- BACKWARDS-INCOMPATIBLE: Indexing into a
Choices
instance now translates database representations to human-readable choice names, rather than simply indexing into an array of choice tuples. (Indexing intoChoices
was previously not documented.) If you have code that is relying on indexing or slicingChoices
, the simplest workaround is to change e.g.STATUS[1:]
tolist(STATUS)[1:]
. - Fixed bug with checking for field name conflicts for added query managers on StatusModel.
- Can pass choices_name to StatusField to use a different name for
choices class attribute.
STATUS
is used by default. - Can pass model subclasses, rather than strings, into select_subclasses(). Thanks Keryn Knight. Merge of GH-79.
- Deepcopying a Choices instance no longer fails with infinite recursion in getattr. Thanks Leden. Merge of GH-75.
- get_subclass() method is now available on both managers and querysets. Thanks Travis Swicegood. Merge of GH-82.
- Fix bug in InheritanceManager with grandchild classes on Django 1.6+; select_subclasses('child', 'child__grandchild') would only ever get to the child class. Thanks Keryn Knight for report and proposed fix.
- MonitorField now accepts a 'when' parameter. It will update only when the field changes to one of the values specified.
- Choices now accepts option-groupings. Fixes GH-14.
- Choices can now be added to other Choices or to any iterable, and can be compared for equality with itself. Thanks Tony Aldridge. (Merge of GH-76.)
- Choices now __contains__ its Python identifier values. Thanks Keryn Knight. (Merge of GH-69).
- Fixed a bug causing
KeyError
when saving with the parameterupdate_fields
in which there are untracked fields. Thanks Mikhail Silonov. (Merge of GH-70, fixes GH-71). - Fixed
FieldTracker
usage on inherited models. Fixes GH-57. - Added mutable field support to
FieldTracker
(Merge of GH-73, fixes GH-74)
- Introduced
FieldTracker
as replacement forModelTracker
, which is now deprecated. PassThroughManager.for_queryset_class()
no longer ignores superclassget_query_set
. Thanks Andy Freeland.- Fixed
InheritanceManager
bug with grandchildren in Django 1.6. Thanks CrazyCasta. - Fixed lack of
get_FOO_display
method forStatusField
. Fixes GH-41.
- Added explicit default to
BooleanField
in tests, for Django trunk compatibility. - Fixed intermittent
StatusField
bug. Fixes GH-29. - Added Python 3 support.
- Dropped support for Django 1.2 and 1.3. Django 1.4.2+ required.
- Allow specifying default value for a
StatusField
. Thanks Felipe Prenholato. - Fix calling
create()
on aRelatedManager
that subclasses a dynamicPassThroughManager
. Thanks SeiryuZ for the report. Fixes GH-24. - Add workaround for https://code.djangoproject.com/ticket/16855 in
InheritanceQuerySet to avoid overriding prior calls to
select_related()
. Thanks ivirabyan. - Added support for arbitrary levels of model inheritance in InheritanceManager. Thanks ivirabyan. (This feature only works in Django 1.6+ due to https://code.djangoproject.com/ticket/16572).
- Added
ModelTracker
for tracking field changes between model saves. Thanks Trey Hunner.
- Moved primary development from Bitbucket to GitHub. Bitbucket mirror will continue to receive updates; Bitbucket issue tracker will be closed once all issues tracked in it are resolved.
- Removed deprecated
ChoiceEnum
,InheritanceCastModel
,InheritanceCastManager
, andmanager_from
. - Fixed pickling of
PassThroughManager
. Thanks Rinat Shigapov. - Set
use_for_related_fields = True
onQueryManager
. - Added
__len__
method toChoices
. Thanks Ryan Kaskel and James Oakley. - Fixed
InheritanceQuerySet
on Django 1.5. Thanks Javier Garcia Sogo.
- Updated AutoCreatedField, AutoLastModifiedField, MonitorField, and
TimeFramedModel to use
django.utils.timezone.now
on Django 1.4. Thanks Donald Stufft. - Fixed annotation of InheritanceQuerysets. Thanks Jeff Elmore and Facundo Gaich.
- Dropped support for Python 2.5 and Django 1.1. Both are no longer supported even for security fixes, and should not be used.
- Added
PassThroughManager.for_queryset_class()
, which fixes use ofPassThroughManager
with related fields. Thanks Ryan Kaskel for report and fix. - Added
InheritanceManager.get_subclass()
. Thanks smacker.
- Fixed using SplitField on an abstract base model.
- Fixed issue #8, adding
use_for_related_fields = True
toInheritanceManager
. - Added
PassThroughManager
. Thanks Paul McLanahan. - Added pending-deprecation warnings for
InheritanceCastModel
,manager_from
, and Django 1.1 support. Removed documentation for the deprecated utilities. BumpedChoiceEnum
from pending-deprecation to deprecation. - Fixed issue #6, bug with InheritanceManager and descriptor fields (e.g. FileField). Thanks zyegfryed for the fix and sayane for tests.
- updated SplitField to define get_prep_value rather than get_db_prep_value. This avoids deprecation warnings on Django trunk/1.3, but makes SplitField incompatible with Django versions prior to 1.2.
- added InheritanceManager, a better approach to selecting subclass instances for Django 1.2+. Thanks Jeff Elmore.
- added InheritanceCastManager and InheritanceCastQuerySet, to allow bulk casting of a queryset to child types. Thanks Gregor Muellegger.
- added manager_from (thanks George Sakkis)
- added StatusField, MonitorField, TimeFramedModel, and StatusModel (thanks Jannis Leidel)
- deprecated ChoiceEnum and replaced with Choices
- added SplitField
- added ChoiceEnum
- added South support for custom model fields
- Added
QueryManager