Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions docs/community/3.17-announcement.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<style>
.promo li a {
float: left;
width: 130px;
height: 20px;
text-align: center;
margin: 10px 30px;
padding: 150px 0 0 0;
background-position: 0 50%;
background-size: 130px auto;
background-repeat: no-repeat;
font-size: 120%;
color: black;
}
.promo li {
list-style: none;
}
</style>

# Django REST framework 3.17

At the Internet, on October 31th, 2025, we are happy to announce the release of Django REST framework 3.17.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

november?


## Move to Django-Commons

The project development has moved from [@encode](https://github.com/encode) to the [@django-commons](https://github.com/django-commons) organization on GitHub. The maintenance team being the project remains mostly unchanged since the last release but Kim stepped down from the team and is no longer involved. We're grateful for all the work Kim put into the project over the years.

With Kim stepping down, it felt like the project needed a new home and it felt like Django commons was the right place for it. The organization is set up around an admin team that

## Updated Python support

The latest release now fully supports Python 3.14, and Python 3.9 support was dropped. Please refer to Django support page to know which Django versions support 3.14.

The current minimum versions of Django remains 4.2.

## Delay CoreAPI deprecation

This was initially planned for 3.17, but we unfortunately didn't find the time to handle this in time so we mad the decision to delay it until 3.18. The exception being raised has been renamed from `RemovedInDRF317Warning` to `RemovedInDRF318Warning` so you may have to update your warnings filters accordingly.

## Migrated packaging to `pyproject.toml`

The packaging of the project has been migrated to `pyproject.toml` to align with modern packaging best practices. We don't expect this to have any impacts since Django itself has already migrated.

## Improved error messages for UniqueConstraint

The validation for [UniqueConstraint](https://docs.djangoproject.com/en/stable/ref/models/constraints/#uniqueconstraint) has been improved to support better error messages (via `violation_error_code` and `violation_error_message`)

## Other fixes and improvements

There are a few fixes and minor improvements in this release, ranging from documentation, internal infrastructure (typing, testing, requirements, deprecation, etc.), security and overall behavior.

See the [release notes](release-notes.md) page for a complete listing.
80 changes: 80 additions & 0 deletions docs/community/release-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,86 @@ You can determine your currently installed version using `pip show`:

---

## 3.17.x series

### 3.17.0

**Date**: 31th October 2025
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should be November now


This is a significant release that includes improvements and bugfixes and well as keeping up with upstream Python support.

This is also the first release made from the [@django-commons](https://github.com/django-commons) organization. The people in the maintenance team haven't changed much since the previous release.

### Features

* Add support for Python 3.14 by [@cclauss](https://github.com/cclauss) in [#9780](https://github.com/django-commons/django-rest-framework/pull/9780)
* Drop support for Python 3.9 by [@auvipy](https://github.com/auvipy) in [#9781](https://github.com/django-commons/django-rest-framework/pull/9781)
* Add ability to specify output format for `DurationField` by [@sevdog](https://github.com/sevdog) in [#8532](https://github.com/django-commons/django-rest-framework/pull/8532)
* Add missing decorators: `@versioning_class()`, `@content_negotiation_class()`, `@metadata_class()` for function-based views by [@qqii](https://github.com/qqii) in [#9719](https://github.com/django-commons/django-rest-framework/pull/9719)
* Support `violation_error_code` and `violation_error_message` from `UniqueConstraint` in `UniqueTogetherValidator` by [@s-aleshin](https://github.com/s-aleshin) in [#9766](https://github.com/django-commons/django-rest-framework/pull/9766)
* Add support for `ipaddress` objects in `JSONEncoder` by [@corenting](https://github.com/corenting) in [#9087](https://github.com/django-commons/django-rest-framework/pull/9087)
* Delay CoreAPI deprecation until DRF 3.18 by [@browniebroke](https://github.com/browniebroke) in [#9810](https://github.com/django-commons/django-rest-framework/pull/9810). We didn't find the time to handle this for 3.17 as it was initially planned. The exception being raised has been renamed from `RemovedInDRF317Warning` to `RemovedInDRF318Warning` so you may have to update your warnings filters accordingly.

### Packaging

* Migrate packaging to `pyproject.toml` by [@deronnax](https://github.com/deronnax) in [#9056](https://github.com/django-commons/django-rest-framework/pull/9056).

### Bug fixes

* Refactor token generation to use the `secrets` module by [@mahdirahimi1999](https://github.com/mahdirahimi1999) in [#9760](https://github.com/django-commons/django-rest-framework/pull/9760)
* Prevent small risk of `Token` overwrite by [@mahdirahimi1999](https://github.com/mahdirahimi1999) in [#9754](https://github.com/django-commons/django-rest-framework/pull/9754)
* Fix `UniqueTogetherValidator` validation when condition references a read-only field by [@ticosax](https://github.com/ticosax) in [#9764](https://github.com/django-commons/django-rest-framework/pull/9764)
* Fix validation on many to many field when `default=None` by [@Genarito](https://github.com/Genarito) in [#9790](https://github.com/django-commons/django-rest-framework/pull/9790)
* Fix invalid SPDX license expression in `__init__.py` by [@TheFunctionalGuy](https://github.com/TheFunctionalGuy) in [#9799](https://github.com/django-commons/django-rest-framework/pull/9799)
* Fix `HTMLFormRenderer` to ensure a valid `datetime-local` format by [@mgaligniana](https://github.com/mgaligniana) in [#9365](https://github.com/django-commons/django-rest-framework/pull/9365)
* Fix mutable default arguments in OrderingFilter methods by [@killerdevildog](https://github.com/killerdevildog) in [#9742](https://github.com/django-commons/django-rest-framework/pull/9742)

### Translations

* Update french translation by [@SebCorbin](https://github.com/SebCorbin) in [#9770](https://github.com/django-commons/django-rest-framework/pull/9770)

### Documentation and internal changes

* Rename `master` branch to `main` by [@browniebroke](https://github.com/browniebroke) in [#9761](https://github.com/django-commons/django-rest-framework/pull/9761)
* Restore references to GitHub Issues and Discussions by [@browniebroke](https://github.com/browniebroke) in [#9757](https://github.com/django-commons/django-rest-framework/pull/9757)
* Fix a number of broken links in the documentation by [@browniebroke](https://github.com/browniebroke) in [#9758](https://github.com/django-commons/django-rest-framework/pull/9758)
* Add `drf-shapeless-serializers` to third-party package documentation by [@khaledsukkar2](https://github.com/khaledsukkar2) in [#9717](https://github.com/django-commons/django-rest-framework/pull/9717)
* Document how to transform factory request to DRF request by [@mgaligniana](https://github.com/mgaligniana) in [#9380](https://github.com/django-commons/django-rest-framework/pull/9380)
* Remove outdated reference to `AllowPUTAsCreateMixin` in the documentation by [@zankoAn](https://github.com/zankoAn) in [#9788](https://github.com/django-commons/django-rest-framework/pull/9788)
* Clarify where settings come from in filtering documentation by [@journpy](https://github.com/journpy) in [#9795](https://github.com/django-commons/django-rest-framework/pull/9795)
* Add syntax highlighting to code examples in tutorial by [@Infamous003](https://github.com/Infamous003) in [#9794](https://github.com/django-commons/django-rest-framework/pull/9794)
* Illustrate `last_page_strings` with an example in the documentation by [@mahdighadiriii](https://github.com/mahdighadiriii) in [#9800](https://github.com/django-commons/django-rest-framework/pull/9800)
* Add section about avoiding N+1 queries in generic views by [@p-r-a-v-i-n](https://github.com/p-r-a-v-i-n) in [#9801](https://github.com/django-commons/django-rest-framework/pull/9801)
* Add Apitally to third party packages documentation by [@itssimon](https://github.com/itssimon) in [#9718](https://github.com/django-commons/django-rest-framework/pull/9718)
* Remove Transifex mentions from documentation by [@TGoddessana](https://github.com/TGoddessana) in [#9572](https://github.com/django-commons/django-rest-framework/pull/9572)
* Add `drf-auth-kit` to third party authentication packages documentation by [@huynguyengl99](https://github.com/huynguyengl99) in [#9785](https://github.com/django-commons/django-rest-framework/pull/9785)
* Standardize spelling to American English in documentation by [@p-r-a-v-i-n](https://github.com/p-r-a-v-i-n) in [#9804](https://github.com/django-commons/django-rest-framework/pull/9804)

* Adjust CI matrix to reflect upstream Django support by [@browniebroke](https://github.com/browniebroke) in [#9768](https://github.com/django-commons/django-rest-framework/pull/9768)
* Automate documentation deployment by [@browniebroke](https://github.com/browniebroke) in [#9759](https://github.com/django-commons/django-rest-framework/pull/9759)
* Set minimum Python version to 3.10 in pyupgrade pre-commit hook by [@browniebroke](https://github.com/browniebroke) in [#9798](https://github.com/django-commons/django-rest-framework/pull/9798)
* Update blacken-docs and black to latest versions by [@browniebroke](https://github.com/browniebroke) in [#9802](https://github.com/django-commons/django-rest-framework/pull/9802)
* Update pre-commit hooks by [@browniebroke](https://github.com/browniebroke) in [#9805](https://github.com/django-commons/django-rest-framework/pull/9805)

## New Contributors

* [@khaledsukkar2](https://github.com/khaledsukkar2) made their first contribution in [#9717](https://github.com/django-commons/django-rest-framework/pull/9717)
* [@qqii](https://github.com/qqii) made their first contribution in [#9719](https://github.com/django-commons/django-rest-framework/pull/9719)
* [@zankoAn](https://github.com/zankoAn) made their first contribution in [#9788](https://github.com/django-commons/django-rest-framework/pull/9788)
* [@journpy](https://github.com/journpy) made their first contribution in [#9795](https://github.com/django-commons/django-rest-framework/pull/9795)
* [@s-aleshin](https://github.com/s-aleshin) made their first contribution in [#9766](https://github.com/django-commons/django-rest-framework/pull/9766)
* [@Infamous003](https://github.com/Infamous003) made their first contribution in [#9794](https://github.com/django-commons/django-rest-framework/pull/9794)
* [@Genarito](https://github.com/Genarito) made their first contribution in [#9790](https://github.com/django-commons/django-rest-framework/pull/9790)
* [@TheFunctionalGuy](https://github.com/TheFunctionalGuy) made their first contribution in [#9799](https://github.com/django-commons/django-rest-framework/pull/9799)
* [@mahdighadiriii](https://github.com/mahdighadiriii) made their first contribution in [#9800](https://github.com/django-commons/django-rest-framework/pull/9800)
* [@p-r-a-v-i-n](https://github.com/p-r-a-v-i-n) made their first contribution in [#9801](https://github.com/django-commons/django-rest-framework/pull/9801)
* [@itssimon](https://github.com/itssimon) made their first contribution in [#9718](https://github.com/django-commons/django-rest-framework/pull/9718)
* [@huynguyengl99](https://github.com/huynguyengl99) made their first contribution in [#9785](https://github.com/django-commons/django-rest-framework/pull/9785)
* [@corenting](https://github.com/corenting) made their first contribution in [#9087](https://github.com/django-commons/django-rest-framework/pull/9087)
* [@killerdevildog](https://github.com/killerdevildog) made their first contribution in [#9742](https://github.com/django-commons/django-rest-framework/pull/9742)

[Full Changelog](https://github.com/django-commons/django-rest-framework/compare/3.16.1...3.17.0)

## 3.16.x series

### 3.16.1
Expand Down
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ nav:
- 'Contributing to REST framework': 'community/contributing.md'
- 'Project management': 'community/project-management.md'
- 'Release Notes': 'community/release-notes.md'
- '3.17 Announcement': 'community/3.17-announcement.md'
- '3.16 Announcement': 'community/3.16-announcement.md'
- '3.15 Announcement': 'community/3.15-announcement.md'
- '3.14 Announcement': 'community/3.14-announcement.md'
Expand Down
2 changes: 1 addition & 1 deletion rest_framework/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"""

__title__ = 'Django REST framework'
__version__ = '3.16.1'
__version__ = '3.17.0'
__author__ = 'Tom Christie'
__license__ = 'BSD-3-Clause'
__copyright__ = 'Copyright 2011-2023 Encode OSS Ltd'
Expand Down