Release notes
Django 1.7 release notes
Backwards incompatible changes in 1.7
Some operations ran multiple data modifying queries without wrapping them in a transaction, and some operations didn’t respect default filtering when it was present (i.e. when the default manager on the related model implemented a custom get_queryset()).
Release notes
Django 1.7 release notes
Backwards incompatible changes in 1.7
Rationale behind this is removal of dependency of non-contrib code on contrib applications. The old cache URI syntax (e.g. "locmem://") is no longer supported. It still worked, even though it was not documented or officially supported.
Release notes
Django 1.7 release notes
These features have reached the end of their deprecation cycle and are removed in Django 1.7. See Features deprecated in 1.5 for details, including how to remove usage of these features. django.utils.simplejson is removed. django.utils.itercompat.product is removed.
Release notes
Django 1.8 release notes
What’s new in Django 1.8
Query Expressions allow you to create, customize, and compose complex SQL expressions. This has enabled annotate to accept expressions other than aggregates. Aggregates are now able to reference multiple fields, as well as perform arithmetic, similar to F() objects.
Release notes
Django 1.8 release notes
The SEND_BROKEN_LINK_EMAILS setting is removed. django.middleware.doc.XViewMiddleware is removed. The Model._meta.module_name alias is removed. The backward compatible shims introduced to rename get_query_set and similar queryset methods are removed. This affects the following classes: BaseModelAdmin, ChangeList, BaseCommentNode, GenericForeignKey, Manager, SingleRelatedObjectDescriptor and ReverseSingleRelatedObjectDescriptor.
Release notes
Django 1.8.1 release notes
Fixed a crash with QuerySet.update() on foreign keys to one-to-one fields (#24578). Fixed a regression in the model detail view of admindocs when a model has a reverse foreign key relation (#24624). Prevented arbitrary file inclusions in admindocs (#24625).
Release notes
Django 1.8.5 release notes
Fixed custom queryset chaining with values() and values_list() (#20625). Moved the unsaved model instance assignment data loss check on reverse relations to Model.save() (#25160). Readded inline foreign keys to form instances when validating model formsets (#25431).
Release notes
Django 1.8.7 release notes
Fixed a regression in 1.8.6 by restoring the ability to use Manager objects for the queryset argument of ModelChoiceField (#25683). Fixed a regression in 1.8.6 that caused an application with South migrations in the migrations directory to fail (#25618).
Release notes
Django 1.9.1 release notes
Prevented QuerySet.delete() from crashing on MySQL when querying across relations (#25882). Fixed evaluation of zero-length slices of QuerySet.values() (#25894). Fixed a state bug when using an AlterModelManagers operation (#25852). Fixed TypedChoiceField change detection with nullable fields (#25942).
Release notes
Django 2.0 release notes
What’s new in Django 2.0Minor features
On Oracle, AutoField and BigAutoField are now created as identity columns. The new chunk_size parameter of QuerySet.iterator() controls the number of rows fetched by the Python database client when streaming results from the database.
Release notes
Django 2.0 release notes
Features deprecated in 2.0
HttpRequest.xreadlines() is deprecated in favor of iterating over the request. The field_name keyword argument to QuerySet.earliest() and QuerySet.latest() is deprecated in favor of passing the field names as arguments. Write .earliest('pub_date') instead of .earliest(field_name='pub_date').
Release notes
Django 2.0.1 release notes
Reallowed filtering a queryset with GeometryField=None (#28896). Corrected admin check to allow a OneToOneField in ModelAdmin.autocomplete_fields (#28898). Fixed a regression on SQLite where DecimalField returned a result with trailing zeros in the fractional part truncated (#28915).
Release notes
Django 2.0.2 release notes
Fixed regression in the use of QuerySet.values_list(..., flat=True) followed by annotate() (#29067). Fixed a regression where a queryset that annotates with geometry objects crashes (#29054).
Release notes
Django 2.0.5 release notes
Fixed a regression in Django 2.0.4 where QuerySet.values() or values_list() after combining an annotated and unannotated queryset with union(), difference(), or intersection() crashed due to mismatching columns (#29286).
Release notes
Django 2.1.11 release notes
Key and index lookups for django.contrib.postgres.fields.JSONField and key lookups for HStoreField were subject to SQL injection, using a suitably crafted dictionary, with dictionary expansion, as the **kwargs passed to QuerySet.filter().
Release notes
Django 2.2 release notes
What’s new in Django 2.2Minor features
Added the NullIf and Reverse database functions, as well as many math database functions. Setting the new ignore_conflicts parameter of QuerySet.bulk_create() to True tells the database to ignore failure to insert rows that fail uniqueness constraints or other checks.
Release notes
Django 2.2.1 release notes
Fixed a regression in Django 2.2 where Paginator crashes if object_list is a queryset ordered or aggregated over a nested JSONField key transform (#30335).
Release notes
Django 2.2.4 release notes
Key and index lookups for django.contrib.postgres.fields.JSONField and key lookups for HStoreField were subject to SQL injection, using a suitably crafted dictionary, with dictionary expansion, as the **kwargs passed to QuerySet.filter().
Release notes
Django 2.2.8 release notes
Fixed a data loss possibility in the select_for_update(). When using 'self' in the of argument with multi-table inheritance, a parent model was locked instead of the queryset’s model (#30953).
Release notes
Django 3.0 release notes
Backwards incompatible changes in 3.0
Attempts to use a new Model instance to update an existing row will result in an IntegrityError. In order to update an existing model for a specific primary key value, use the update_or_create() method or QuerySet.filter(pk=…).update(…) instead. For example: