docs/community/release-notes.md
Minor version numbers (0.0.x) are used for changes that are API compatible. You should be able to upgrade between minor point releases without any other code changes.
Medium version numbers (0.x.0) may include API changes, in line with the deprecation policy. You should read the release notes carefully before upgrading between medium point releases.
Major version numbers (x.0.0) are reserved for substantial project milestones.
As REST Framework is considered feature-complete, most releases are expected to be minor releases.
REST framework releases follow a formal deprecation policy, which is in line with Django's deprecation policy.
The timeline for deprecation of a feature present in version 1.0 would work as follows:
Version 1.1 would remain fully backwards compatible with 1.0, but would raise RemovedInDRF13Warning warnings, subclassing PendingDeprecationWarning, if you use the feature that are due to be deprecated. These warnings are silent by default, but can be explicitly enabled when you're ready to start migrating any required changes. For example if you start running your tests using python -Wd manage.py test, you'll be warned of any API changes you need to make.
Version 1.2 would escalate these warnings to subclass DeprecationWarning, which is loud by default.
Version 1.3 would remove the deprecated bits of API entirely.
Note that in line with Django's policy, any parts of the framework not mentioned in the documentation should generally be considered private API, and may be subject to change.
To upgrade Django REST framework to the latest version, use pip:
pip install -U djangorestframework
You can determine your currently installed version using pip show:
pip show djangorestframework
Date: 24th March 2026
HTMLFormRenderer with empty datetime values by @p-r-a-v-i-n in #9928Full Changelog: 3.17.0...3.17.1
Date: 18th March 2026
DurationField by @sevdog in #8532@versioning_class(), @content_negotiation_class(), @metadata_class() for function-based views by @qqii in #9719violation_error_code and violation_error_message from UniqueConstraint in UniqueTogetherValidator by @s-aleshin in #9766ipaddress objects in JSONEncoder by @corenting in #9087BigInteger to string by @HoodyH in #9775Token overwrite by @mahdirahimi1999 in #9754UniqueTogetherValidator validation when condition references a read-only field by @ticosax in #9764default=None by @Genarito in #9790__init__.py by @TheFunctionalGuy in #9799HTMLFormRenderer to ensure a valid datetime-local format by @mgaligniana in #9365MultipleChoiceField by @fbozhang in #9735pyproject.toml by @deronnax in #9056MANIFEST.in to pyproject.toml by @p-r-a-v-i-n in #9825secrets module by @mahdirahimi1999 in #9760@api_view by @kernelshard in #9821Full Changelog: 3.16.1...3.17.0
Date: 6th August 2025
This release fixes a few bugs, clean-up some old code paths for unsupported Python versions and improve translations.
backports.zoneinfo dependency and conditions on unsupported Python 3.8 and lower in #9681. Python versions prior to 3.9 were already unsupported so this shouldn't be a breaking change.unique_together validation with SerializerMethodField in #9712UniqueTogetherValidator to handle fields with source attribute in #9688drf-restwind and update outdated images in browsable-api.md in #9680djangorestframework-guardian2 to djangorestframework-guardian in #9734request in serializer context when using HyperlinkedModelSerializer in #9732pyupgrade to pre-commit hooks in #9682pytz is available in #9715@araggohnxd made their first contribution in #9673@mbeijen made their first contribution in #9660@stefan6419846 made their first contribution in #9676@ren000thomas made their first contribution in #9675@ulgens made their first contribution in #9682@bukh-sal made their first contribution in #9595@rezatn0934 made their first contribution in #9576@Rohit10jr made their first contribution in #9693@kushibayev made their first contribution in #9713@alihassancods made their first contribution in #9732@kulikjak made their first contribution in #9715@Natgho made their first contribution in #9749Full Changelog: https://github.com/encode/django-rest-framework/compare/3.16.0...3.16.1
Date: 28th March 2025
This release is considered a significant release to improve upstream support with Django and Python. Some of these may change the behavior of existing features and pre-existing behavior. Specifically, some fixes were added to around the support of UniqueConstraint with nullable fields which will improve built-in serializer validation.
LoginRequiredMiddleware in #9514 and #9657UniqueConstraint in #9360UniqueConstraint in #9531unique_together validation with source in #9482AttributeError raised within properties in #9455get_template_context to handle also lists in #9467DecimalField in #9515open() in setup.py in #9661AutoSchema._get_reference method in #9525OperandHolder in #9437adrf third party package in #9198queryset attribute in #9528httpie call in docs in #9543<> in validators example in #9590strftime link in the docs in #9624action attribute in 'Introspecting ViewSet actions' docs section in #9633rest-framework-gm2m-relations package to the list of 3rd party libraries in #9063django-pyoidc as a third party authentication library in #9667@maerteijn made their first contribution in #9198@FraCata00 made their first contribution in #9444@AlvaroVega made their first contribution in #9451@james-mchugh made their first contribution in #9455@ifeanyidavid made their first contribution in #9479@p-schlickmann made their first contribution in #9480@akkuman made their first contribution in #9505@rafaelgramoschi made their first contribution in #9509@Sinaatkd made their first contribution in #9521@gtkacz made their first contribution in #9535@sliverc made their first contribution in #9556@gabrielromagnoli1987 made their first contribution in #9543@cheehong1030 made their first contribution in #9563@amansharma612 made their first contribution in #9590@Gluroda made their first contribution in #9616@deepakangadi made their first contribution in #9624@EXG1O made their first contribution in #9633@decadenza made their first contribution in #9640@mojtabaakbari221b made their first contribution in #9063@mikemanger made their first contribution in #9661@gbip made their first contribution in #9667Full Changelog: https://github.com/encode/django-rest-framework/compare/3.15.2...3.16.0
Date: 14th June 2024
Date: 22nd March 2024
SearchFilter handling of quoted and comma separated strings, when .get_search_terms is being called into by a custom class. See [#9338]Date: 15th March 2024
SearchFilter rendering search field with invalid value [#9023]timedelta [#9007]NamespaceVersioning ignoring DEFAULT_VERSION on non-None namespaces [#7278]field.choices that triggered full table load [#8950]BooleanField validation [#8970]BrowsableAPIRenderer for usage with ListSerializer. [#7530]OR of two permission classes [#7522]pytz [#8984]Serializer [#8001]OrderedDict with dict [#8964]__eq__ for validators [#8925]can_read_model permission in DjangoModelPermissions [#8009]basename is not unique [#8438]_ignore_model_permissions = True [#8772]__eq__ method for OperandHolder class [#8710]django.test package when not testing [#8699]examples and format to OpenAPI schema of CursorPagination [#8687] [#8686]Date: 22nd September 2022
--api-version CLI option to generateschema management command. [#8663]is_valid(raise_exception=False) as a keyword-only argument. [#7952]set_context on Validators. [#8589]NotImplemented from ErrorDetails.__ne__. [#8538]DateTimeField.default_timezone when a custom timezone is set. [#8531]ManyRelatedField falling back to the default value when the attribute specified by dot notation doesn't exist. Matches ManyRelatedField.get_attribute to Field.get_attribute. [#7574]schemas.openapi.get_reference public. [#7515]ReturnDict support dict union operators on Python 3.9 and later. [#8302]request.user is set before checking if the user is authenticated. [#8370]Date: 15th December 2021
@api_view. [#8297]Date: 13th December 2021
max_length and min_length options to ListSerializer. [#8165]get_request_serializer and get_response_serializer hooks to AutoSchema. [#7424]UNICODE_JSON setting in API schema outputs. [#7991]RemoteUserAuthentication. [#7158]Date: 26th March 2021
deque instead of list for tracking throttling .history. (Due to incompatibility with DjangoRedis cache backend. See #7870) [#7872]Date: 25th March 2021
COUNT query when LimitOffsetPagination is configured but pagination params are not included on the request. [#6098]allow_null=True on DecimalField. [#7718]"Yes"/"No" values with BooleanField. [#7739]PageNumberPagination.get_page_number() method for overriding behavior. [#7652]PrimaryKeyRelatedField fields, instead of casting to ints. [#7597]OrderingFilter. [#7609]deque instead of list for tracking throttling .history. [#7849]Date: 13th October 2020
rest_framework.authtoken.models is imported, but rest_framework.authtoken is not in INSTALLED_APPS. [#7571]get_queryset() methods are not masked. [#7480]Date: 28th September 2020
TokenProxy migration. [#7557]Date: 28th September 2020
--file option to generateschema command. [#7130]tags for OpenAPI schema generation. See the schema docs. [#7184]AutoSchema become public API: get_path_parameters, get_pagination_parameters, get_filter_parameters, get_request_body, get_responses, get_serializer, get_paginator, map_serializer, map_field, map_choice_field, map_field_validators, allows_filters. See the schema docsJSONField. [#7467]SearchFilter now supports nested search on JSONField and HStoreField model fields. [#7121]SearchFilter now supports searching on annotate() fields. [#6240]pk in the admin URL. [#7341]__repr__ for Request instances. [#7239]ListField schema output to include all available child information. [#7137]default=False to be included for BooleanField schema outputs. [#7165]"type" information in ChoiceField schema outputs. [#7161]"type": "object" on schema objects. [#7169]DecimalField. [#7254]ObtainAuthToken view. [#7211]context=... to view .get_serializer() methods. [#7298]PermissionDenied if permission class has one set. [#7306]ChoiceField to a schema output. [#7264]UniqueTogether handling when serializer fields use source=.... [#7143]HEAD requests now set self.action correctly on a ViewSet instance. [#7223]ModelSerializer[Author]. [#7385]charset=None portion in the request Content-Type header when using APIClient. [#7400]\Z/\z tokens in OpenAPI regexs. [#7389]PrimaryKeyRelatedField and HyperlinkedRelatedField when source field is actually a property. [#7142]Token.generate_key is now a class method. [#7502]@action warns if method is wrapped in a decorator that does not preserve information using @functools.wraps. [#7098]serializers.NullBooleanField in favor of serializers.BooleanField with allow_null=True [#7122]Date: 30th September 2020
urlize_quoted_links template tag in favor of Django's built-in urlize. Removes a XSS vulnerability for some kinds of content in the browsable API.Date: 5th August 2020
Date: 12th December 2019
.set_context API in favor of a requires_context marker.serializers.HStoreField in OpenAPI schemas. #6914int64 representation for large integers in OpenAPI schemas. #7018.to_representation implementation is provided on a field subclass. #6996Date: 4th September 2019
lowerInitialCamelCase style in OpenAPI operation IDs.minLength/maxLength/minItems/maxItems properties in OpenAPI schemas.FileField.url once in serialization, for improved performance.Date: 29th July 2019
OpenAPI schema fixes.Date: 17th July 2019
uritemplate for OpenAPI schema generation, but not coreapi.Date: 15th July 2019
generateschema --generator_class CLI optionpyyaml>=5.1 #6680user.get_username in templates, in preference to user.username.source="*"SerializerMethodField field name arguments.detail_route decorator in favor of action, which accepts a detail bool. Use @action(detail=True) instead. gh6687list_route decorator in favor of action, which accepts a detail bool. Use @action(detail=False) instead. gh6687Date: 10th May 2019
This is a maintenance release that fixes an error handling bug under Python 2.
Date: 29th April 2019
This is the last Django REST Framework release that will support Python 2. Be sure to upgrade to Python 3 before upgrading to Django REST Framework 3.10.
Date: 3rd March 2019
_urls cache on register() #6407validators to accept non-list iterables. #6282RemovedInDRF…Warning classes to simplify deprecations. #6480Date: 16th January 2019
limit_choices_to on foreign keys. #6371Date: 18th October 2018
action support for ViewSet suffixes #6081action docs sections #6060Router.register base_name argument in favor of basename. #5990Router.get_default_base_name method in favor of Router.get_default_basename. #5990CharField to disallow null bytes. #6073
To revert to the old behavior, subclass CharField and remove ProhibitNullCharactersValidator from the validators.
class NullableCharField(serializers.CharField):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.validators = [
v
for v in self.validators
if not isinstance(v, ProhibitNullCharactersValidator)
]
OpenAPIRenderer and generate_schema management command. #6229e.indexOf is not a function error #5982DjangoObjectPermissionsFilter class, moved to the djangorestframework-guardian package. #6075Date: 6th April 2018
read_only + default unique_together validation. #5922Date: 4th April 2018
Use old url_name behavior in route decorators #5915
For list_route and detail_route maintain the old behavior of url_name,
basing it on the url_path instead of the function name.
Date: 3rd April 2018
Breaking Change: Alter read_only plus default behavior. #5886
read_only fields will now always be excluded from writable fields.
Previously read_only fields with a default value would use the default for create and update operations.
In order to maintain the old behavior you may need to pass the value of read_only fields when calling save() in
the view:
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
Alternatively you may override save() or create() or update() on the serializer as appropriate.
Correct allow_null behavior when required=False #5888
Without an explicit default, allow_null implies a default of null for outgoing serialization. Previously such
fields were being skipped when read-only or otherwise not required.
Possible backwards compatibility break if you were relying on such fields being excluded from the outgoing
representation. In order to restore the old behavior you can override data to exclude the field when None.
For example:
@property
def data(self):
"""
Drop `maybe_none` field if None.
"""
data = super().data
if 'maybe_none' in data and data['maybe_none'] is None:
del data['maybe_none']
return data
Refactor dynamic route generation and improve viewset action introspectibility. #5705
ViewSets have been provided with new attributes and methods that allow
it to introspect its set of actions and the details of the current action.
list_route and detail_route into a single action decorator.ViewSet with .get_extra_actions().url_name and url_path on the decorated method.url_name is now based on the function name, instead of the url_path,
as the path is not always suitable (e.g., capturing arguments in the path)..reverse_action() method (added in 3.7.4)self.reverse_action(self.custom_action.url_name)detail initkwarg to indicate if the current action is operating on a
collection or a single instance.Additional changes:
list_route & detail_route in favor of action decorator with detail boolean.DynamicRoute with detail boolean.list_route and detail_route maintain the old behavior of url_name,
basing it on the url_path instead of the function name.Fix formatting of the 3.7.4 release note #5704
Docs: Update DRF Writable Nested Serializers references #5711
Docs: Fixed typo in auth URLs example. #5713
Improve composite field child errors #5655
Disable HTML inputs for dict/list fields #5702
Fix typo in HostNameVersioning doc #5709
Use rsplit to get module and classname for imports #5712
Formalize URLPatternsTestCase #5703
Add exception translation test #5700
Test staticfiles #5701
Add drf-yasg to documentation and schema 3rd party packages #5720
Remove unused compat._resolve_model() #5733
Drop compat workaround for unsupported Python 3.2 #5734
Prefer iter(dict) over iter(dict.keys()) #5736
Pass python_requires argument to setuptools #5739
Remove unused links from docs #5735
Prefer https protocol for links in docs when available #5729
Add HStoreField, postgres fields tests #5654
Always fully qualify ValidationError in docs #5751
Remove unreachable code from ManualSchema #5766
Allowed customizing API documentation code samples #5752
Updated docs to use pip show #5757
Load 'static' instead of 'staticfiles' in templates #5773
Fixed a typo in fields docs #5783
Refer to "NamespaceVersioning" instead of "NamespacedVersioning" in the documentation #5754
ErrorDetail: add __eq__/__ne__ and __repr__ #5787
Replace background-attachment: fixed in docs #5777
Make 404 & 403 responses consistent with exceptions.APIException output #5763
Small fix to API documentation: schemas #5796
Fix schema generation for PrimaryKeyRelatedField #5764
Represent serializer DictField as an Object in schema #5765
Added docs example reimplementing ObtainAuthToken #5802
Add schema to the ObtainAuthToken view #5676
Fix request formdata handling #5800
Fix authtoken views imports #5818
Fixed active timezone handling for non ISO8601 datetimes. #5833
Made TemplateHTMLRenderer render IntegerField inputs when value is 0. #5834
Corrected endpoint in tutorial instructions #5835
Add Django Rest Framework Role Filters to Third party packages #5809
Use single copy of static assets. Update jQuery #5823
Changes ternary conditionals to be PEP308 compliant #5827
Added links to 'A Todo List API with React' and 'Blog API' tutorials #5837
Fix comment typo in ModelSerializer #5844
Add admin to installed apps to avoid test failures. #5870
Fixed schema for UUIDField in SimpleMetadata. #5872
Corrected docs on router include with namespaces. #5843
Test using model objects for dotted source default #5880
Allow traversing nullable related fields #5849
Added: Tutorial: Django REST with React (Django 2.0) #5891
Add LimitOffsetPagination.get_count to allow method override #5846
Don't show hidden fields in metadata #5854
Enable OrderingFilter to handle an empty tuple (or list) for the 'ordering' field. #5899
Added generic 500 and 400 JSON error handlers. #5904
Date: 21st December 2017
Date: 21st December 2017
Date: 21st December 2017
Date: 20th December 2017
Schema: Extract method for manual_fields processing #5633
Allows for easier customization of manual_fields processing, for example
to provide per-method manual fields. AutoSchema adds get_manual_fields,
as the intended override point, and a utility method update_fields, to
handle by-name field replacement from a list, which, in general, you are not
expected to override.
Note: AutoSchema.__init__ now ensures manual_fields is a list.
Previously may have been stored internally as None.
Remove ulrparse compatibility shim; use six instead #5579
Drop compat wrapper for TimeDelta.total_seconds() #5577
Clean up all whitespace throughout project #5578
Compat cleanup #5581
Remove set_rollback() from compat #5591
Fix request body/POST access #5590
Rename test to reference correct issue #5610
Remove references to unsupported Django versions in docs and code #5602
Test Serializer exclude for declared fields #5599
Fixed schema generation for filter backends #5613
Minor cleanup for ModelSerializer tests #5598
Reimplement request attribute access w/ __getattr__ #5617
Fixed SchemaJSRenderer renders invalid Javascript #5607
Make Django 2.0 support official/explicit #5619
Perform type check on passed request argument #5618
Fix AttributeError hiding on request authenticators #5600
Update test requirements #5626
Docs: Serializer._declared_fields enable modifying fields on a serializer #5629
Fix packaging #5624
Fix readme rendering for PyPI, add readme build to CI #5625
Update tutorial #5622
Non-required fields with allow_null=True should not imply a default value #5639
Docs: Add allow_null serialization output note #5641
Update to use the Django 2.0 release in tox.ini #5645
Fix Serializer.data for Browsable API rendering when provided invalid data #5646
Docs: Note AutoSchema limitations on bare APIView #5649
Add .basename and .reverse_action() to ViewSet #5648
Docs: Fix typos in serializers documentation #5652
Fix override_settings compat #5668
Add DEFAULT_SCHEMA_CLASS setting #5658
Add docs note re generated BooleanField being required=False #5665
Add 'dist' build #5656
Fix typo in docstring #5678
Docs: Add UNAUTHENTICATED_USER = None note #5679
Update OPTIONS example from “Documenting Your API” #5680
Docs: Add note on object permissions for FBVs #5681
Docs: Add example to to_representation docs #5682
Add link to Classy DRF in docs #5683
Document ViewSet.action #5685
Fix schema docs typo #5687
Fix URL pattern parsing in schema generation #5689
Add example using source=‘*’ to custom field docs. #5688
Fix format_suffix_patterns behavior with Django 2 path() routes #5691
Date: 6th November 2017
AppRegistryNotReady error from contrib.auth view imports #5567Date: 6th November 2017
allow_null=True should imply a default serialization value #5518drf_create_token command #5550wheel] section to [bdist_wheel] as the former is legacy #5557Date: 16th October 2017
source fields #5489Date: 6th October 2017
Fix DjangoModelPermissions to ensure user authentication before calling the view's get_queryset() method. As a side effect, this changes the order of the HTTP method permissions and authentication checks, and 405 responses will only be returned when authenticated. If you want to replicate the old behavior, see the PR for details. #5376
Deprecated exclude_from_schema on APIView and api_view decorator. Set schema = None or @schema(None) as appropriate. #5422
Timezone-aware DateTimeFields now respect active or default timezone during serialization, instead of always using UTC. #5435
Resolves inconsistency whereby instances were serialized with supplied datetime for create but UTC for retrieve. #3732
Possible backwards compatibility break if you were relying on datetime strings being UTC. Have client interpret datetimes or set default or active timezone (docs) to UTC if needed.
Removed DjangoFilterBackend inline with deprecation policy. Use django_filters.rest_framework.FilterSet and/or django_filters.rest_framework.DjangoFilterBackend instead. #5273
Don't strip microseconds from time when encoding. Makes consistent with datetime.
BC Change: Previously only milliseconds were encoded. #5440
Added STRICT_JSON setting (default True) to raise exception for the extended float values (nan, inf, -inf) accepted by Python's json module.
BC Change: Previously these values would converted to corresponding strings. Set STRICT_JSON to False to restore the previous behavior. #5265
Add support for page_size parameter in CursorPaginator class #5250
Make DEFAULT_PAGINATION_CLASS None by default.
BC Change: If your were just setting PAGE_SIZE to enable pagination you will need to add DEFAULT_PAGINATION_CLASS.
The previous default was rest_framework.pagination.PageNumberPagination. There is a system check warning to catch this case. You may silence that if you are setting pagination class on a per-view basis. #5170
Catch APIException from get_serializer_fields in schema generation. #5443
Allow custom authentication and permission classes when using include_docs_urls #5448
Defer translated string evaluation on validators. #5452
Added default value for 'detail' param into 'ValidationError' exception #5342
Adjust schema get_filter_fields rules to match framework #5454
Updated test matrix to add Django 2.0 and drop Django 1.8 & 1.9 BC Change: This removes Django 1.8 and Django 1.9 from Django REST Framework supported versions. #5457
Fixed a deprecation warning in serializers.ModelField #5058
Added a more explicit error message when get_queryset returned None #5348
Fix docs for Response data description #5361
Fix pycache/.pyc excludes when packaging #5373
Fix default value handling for dotted sources #5375
Ensure content_type is set when passing empty body to RequestFactory #5351
Fix ErrorDetail Documentation #5380
Allow optional content in the generic content form #5372
Updated supported values for the NullBooleanField #5387
Fix ModelSerializer custom named fields with source on model #5388
Fixed the MultipleFieldLookupMixin documentation example to properly check for object level permission #5398
Update get_object() example in permissions.md #5401
Fix authtoken management command #5415
Fix schema generation markdown #5421
Allow ChoiceField.choices to be set dynamically #5426
Add the project layout to the quickstart #5434
Reuse 'apply_markdown' function in 'render_markdown' templatetag #5469
Added links to drf-openapi package in docs #5470
Added docstrings code highlighting with pygments #5462
Fixed documentation rendering for views named data #5472
Docs: Clarified 'to_internal_value()' validation behavior #5466
Fix missing six.text_type() call on APIException.str #5476
Document documentation.py #5478
Fix naming collisions in Schema Generation #5464
Call Django's authenticate function with the request object #5295
Update coreapi JS to 0.1.1 #5479
Have is_list_view recognize RetrieveModel… views #5480
Remove Django 1.8 & 1.9 compatibility code #5481
Remove deprecated schema code from DefaultRouter #5482
Refactor schema generation to allow per-view customization.
BC Change: SchemaGenerator.get_serializer_fields has been refactored as AutoSchema.get_serializer_fields and drops the view argument [#5354][gh5354]
Date: 21st August 2017
HTML_CUTOFF is set to None. #5174multipart/form-data correctly. #5176test_hyperlinked_related_lookup_url_encoded_exists. #5179list_route & detail_route with kwargs contains curly bracket in url_path #5187Date: 12th May 2017
get_limit in LimitOffsetPagination to return all records. (#4437)page_size attribute. (#5086, #3692).as_view() to view instance. (#5053)extra_kwargs. (#4688)Date: 10th March 2017
mark_safe in API docs template tags. (#4952, #4953)Date: 9th March 2017
markdown dependency is optional. (#4947)Date: 9th March 2017
See the release announcement.
Date: 10th February 2017
@list_route and @detail_route endpoints. (#4821)PUT requests when prefetch_related is used. (#4661, #4668)Date: 7th November 2016
autofocus support for input controls. (#4650)Date: 1st November 2016
Date: 21st October 2016
rest_framework/compat.py imports. (#4612, #4608, #4601)raise for Python 3.5 compat. (#4600)Date: 20th October 2016
Date: 21st September 2016
RegexField. (#4489, #4490, #2617)admin.html causing CSRF error. (#4472, #4473)ResolverMatch.func_name of api_view decorated view. (#4465, #4462)APIClient.get() when path contains unicode arguments (#4458)Date: 23rd August 2016
AdminRenderer display of PK only related fields. (#4419, #4423)Date: 19th August 2016
Date: 12th August 2016
max_digits=None on DecimalField. (#4377, #4372)Date: 5th August 2016
Date: 5th August 2016
request.user.is_authenticated as property not method, under Django 1.10+ (#4358, #4354)Date: 28th July 2016
root_renderers argument to DefaultRouter. (#4323, #4268)url and schema_url arguments. (#4321, #4308, #4305)pagination_class = None. (#4314, #4289)get_serializer_class. (#4265, #4285)Accept and Content-Type headers. (#4287, #4313, #4281)Date: 14th July 2016
DecimalField. (#4233)must_call_distinct. (#4215)limit=0 should revert to default limit. (#4194).validated_data and .errors as lists not dicts for ListSerializer. (#4180)AUTH_USER_MODEL compat property. (#4176)OrderingFilter should call get_serializer_class() to determine default fields. (#3964)initial for any serializer.Field. (#3943)field.rel. (#3906)help_text in Browsable API forms. (#3812)lookup_type is deprecated in favor of lookup_expr. (#4259)Date: 14th March 2016.
BooleanField. Thanks to Mikalai Radchuk for the fix. (#3910)Token model as abstract when the authtoken application isn't declared. Thanks to Adam Thomas for the report. (#3860, #3858)QueryParameterVersioning does not use DEFAULT_VERSION setting. Thanks to Brad Montgomery for the fix. (#3833)on_delete on the models. Thanks to Mads Jensen for the fix. (#3832)DateField.to_representation to work with Python 2 unicode. Thanks to Mikalai Radchuk for the fix. (#3819)TimeField not handling string times. Thanks to Areski Belaid for the fix. (#3809)Meta.extra_kwargs. Thanks to Kevin Massey for the report and fix. (#3805, #3804)django-crispy-forms. Thanks to Emmanuelle Delescolle, José Padilla and Luis San Pablo for the report, analysis and fix. (#3787, #3636, #3637)Min/MaxValueValidator transfer from a model's DecimalField. Thanks to Kevin Brown for the fix. (#3774)AutoFilterSet to inherit from default_filter_set. Thanks to Tom Linford for the fix. (#3753)DateTimeField does not handle empty values correctly. Thanks to Mick Parker for the report and fix. (#3731, #3726)_get_reverse_relationships() to use correct to_field. Thanks to Benjamin Phillips for the fix. (#3696)get_queryset for RelatedField. Thanks to Ryan Hiebert for the fix. (#3605)Date: 14th December 2015.
ListField enforces input is a list. (#3513)pagination.PageNumberPagination. (#3631, #3684)to_fields attribute. (#3635, #3634)template.render deprecation warnings for Django 1.9. (#3654)NestedBoundField to also handle empty string when rendering its form. (#3677)Date: 4th November 2015.
request.POST (#3592)to_field referring to primary key. (#3593)filter_class is defined. (#3560)Date: 28th October 2015.
to_field when creating ModelSerializer relational fields. (#3526)FilePathField to a serializer field. (#3536)error_messages on ModelSerializer uniqueness constraints. (#3435)max_length constraint for ModelSerializer fields mapped from TextField. (#3509)Date: 27th October 2015.
username in optional logout tag. (#3550)Date: 21th September 2015.
ViewSet.search_fields attribute. (#3324, #3323)allow_empty not working on serializers with many=True. (#3361, #3364)DurationField accepts integers. (#3359)ListField truncation on HTTP PATCH (#3415, #2761)Date: 24th August 2015.
html_cutoff and html_cutoff_text for limiting select dropdowns. (#3313)SearchFilter. (#3316)IPAddressField. ([#3249gh3249) (#3250)LimitOffsetPagination when count=0, offset=0. (#3303)Date: 13th August 2015.
display_value() method for use when displaying relational field select inputs. (#3254)BooleanField checkboxes incorrectly displaying as checked. (#3258)BooleanField to False in all cases. (#2776)WSGIRequest.FILES property without raising incorrect deprecated error. (#3261)Date: 7th August 2015.
1, 0 rendering as true, false in the admin interface. #3227)request.FILES for compat with Django's HTTPRequest class. (#3239)Date: 6th August 2015.
AdminRenderer. (#2926)FilePathField. (#1854)allow_empty to ListField. (#2250)source=<method> on hyperlinked fields. (#2690)ListField(allow_null=True) now allows null as the list value, not null items in the list. (#2766)ManyToMany() maps to allow_empty=False, ManyToMany(blank=True) maps to allow_empty=True. (#2804)OPTIONS requests support nested representations. (#2915)view.action == "metadata" for viewsets with OPTIONS requests. (#3115)allow_blank on UUIDField. ([#3130][gh#3130])DecimalField validation. (#3139)allow_blank=False when used with trim_whitespace=True. (#2712)allow_blank argument. (#3011)UnicodeDecodeError when invalid characters included in header with TokenAuthentication. (#2928)@non_atomic_requests decorator. (#3016)SearchFilter. (#2935)"url": null in the representation. (#2759)HStoreField to include allow_blank=True in DictField mapping. (#2659)Date: 4th June 2015.
DurationField. (#2481, #2989)format argument to UUIDField. (#2788, #3000)MultipleChoiceField empties incorrectly on a partial update using multipart/form-data (#2993, #2894)RelatedField. (#2981, #2811)unique_together relations. (#2975)ChoiceField/MultipleChoiceField representations. (#2839, #2940)ATOMIC_REQUESTS is set. (#2887, #2034)DecimalField accepts 2E+2 as 200 and validates decimal place correctly. (#2948, #2947)UserModel that change username. (#2952)IPAddressField improvements. (#2747, #2618, #3008)DecimalField for easier subclassing. (#2695)Date: 13rd May 2015.
DateField.to_representation can handle str and empty values. (#2656, #2687, #2869)ModelSerializer used with abstract model. (#2757, #2630)HyperLinkedRelatedField (#2724, #2711).model attribute in permissions (#2818)IntegerField to use compiled decimal regex. (#2853)queryset to raise AssertionError. (#2862)DjangoModelPermissions rely on get_queryset. (#2863)AcceptHeaderVersioning with content negotiation in place. (#2868)DjangoObjectPermissions to use views that define get_queryset. (#2905)Date: 23rd March 2015.
serializer_class is used, even when get_serializer method does not exist on the view. (#2743)lookup_url_kwarg handling in viewsets. (#2685, #2591)rest_framework.views in apps.py (#2678)TypeError if PAGE_SIZE not set (#2667, #2700)min_value field error message references max_value. (#2645)MergeDict. (#2640)Date: 5th March 2015.
For full details see the 3.1 release announcement.
Date: 10th February 2015.
_closable_objects breaks pickling. (#1850, #2492)User models with Throttling. (#2524)User.db_table in TokenAuthentication migration. (#2479)AttributeError tracebacks on Request objects. (#2530, #2108)ManyRelatedField.get_value clearing field on partial update. (#2475)detail_route and list_route mutable argument. (#2518)TokenAuthentication. (#2519)Date: 28th January 2015.
DictField and support Django 1.8 HStoreField. (#2451, #2106)UUIDField and support Django 1.8 UUIDField. (#2448, #2433, #2432)BaseRenderer.render now raises NotImplementedError. (#2434)ResultDict and ResultList now appear as standard dict/list. (#2421)HiddenField in the HTML form of the web browsable API page. (#2410)OrderedDict for RelatedField.choices. (#2408)HTTP_X_FORWARDED_FOR. (#2401)FileUploadParser with version 3.x. (#2399)ReturnDict. (#2360)Date: 8th January 2015.
MinValueValidator on models.DateField. (#2369)DefaultRouter. (#2351)required=False allows omission of value for output. (#2342)models.TextField. (#2340)ListSerializer for pagination if required. (#2331, #2327)exclude are model fields. (#2319)IntegerField and max_length argument incompatibility. (#2317)format_suffix_patterns to work with Django's i18n_patterns. (#2278)url_path. (#2010)Date: 17th December 2014.
request.user is made available to response middleware. (#2155)Client.logout() also cancels any existing force_authenticate. (#2218, #2259)min_length message for CharField. (#2255)UnicodeDecodeError, which can occur on serializer repr. (#2270, #2279)SlugRelatedField raising UnicodeEncodeError when used as a multiple choice input. (#2290)Date: 11th December 2014.
create() fails. (#2013)FileUploadParser breaks with empty file names and multiple upload handlers. (#2109)BindingDict to support standard dict-functions. (#2135, #2163)validate() to ListSerializer. (#2168, #2225, #2232)FileField. (#2172)ViewSet.as_view(). (#2175)allow_blank to ChoiceField. (#2184, #2239)fields on serializer is not a list of strings. (#2193, #2213)validated_attrs argument renamed to validated_data in Serializer create()/update(). (#2197)fields on serializer is not a list of strings. (#2213)Date: 1st December 2014
For full details see the 3.0 release announcement.
For older release notes, please see the version 2.x documentation.
<!-- 3.0.1 --> <!-- 3.0.2 --> <!-- 3.0.3 --> <!-- 3.0.4 --> <!-- 3.0.5 --> <!-- 3.1.1 --> <!-- 3.1.2 --> <!-- 3.1.3 --> <!-- 3.2.0 --> <!-- 3.2.1 --> <!-- 3.2.2 --> <!-- 3.2.3 --> <!-- 3.2.4 --> <!-- 3.2.5 --> <!-- 3.3.0 --> <!-- 3.3.1 --> <!-- 3.3.2 --> <!-- 3.3.3 --> <!-- 3.4.0 --> <!-- 3.4.1 --> <!-- 3.4.2 --> <!-- 3.4.3 --> <!-- 3.4.4 --> <!-- 3.4.5 --> <!-- 3.4.6 --> <!-- 3.4.7 --> <!-- 3.5.1 --> <!-- 3.5.2 --> <!-- 3.5.3 --> <!-- 3.5.4 --> <!-- 3.6.1 --> <!-- 3.6.2 --> <!-- 3.6.3 --> <!-- 3.6.4 --> <!-- 3.7.0 --> <!-- 3.7.1 --> <!-- 3.7.2 --> <!-- 3.7.3 --> <!-- 3.7.4 --> <!-- 3.7.5 --> <!-- 3.8.0 --> <!-- 3.8.1 --> <!-- 3.8.2 --> <!-- 3.9.0 --> <!-- 3.9.1 --> <!-- 3.9.2 --> <!-- 3.9.3 --> <!-- 3.10.0 --> <!-- 3.11.0 -->