mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-11-01 00:17:40 +03:00 
			
		
		
		
	Standardize spelling to American English in documentation (#9804)
* Standardize spelling to American English (only in .md files) * Update remaining British english spell words to American english style * Configures the codespell pre-commit hook to enforce US English consistency changes: - Activates the `en-GB_to_en-US` built-in dictionary to flag British spellings - Created codespell-ignore-words.txt file to ignore specific words - include `code` and `names` for comprehensive typo checking in technical contexts. - changed the 'lets' to 'let's'.
This commit is contained in:
		
							parent
							
								
									0653a63e6d
								
							
						
					
					
						commit
						ade172e1d5
					
				|  | @ -29,6 +29,11 @@ repos: | ||||||
|   rev: v2.4.1 |   rev: v2.4.1 | ||||||
|   hooks: |   hooks: | ||||||
|   - id: codespell |   - id: codespell | ||||||
|  |     args: [ | ||||||
|  |             "--builtin", "clear,rare,code,names,en-GB_to_en-US", | ||||||
|  |             "--ignore-words", "codespell-ignore-words.txt", | ||||||
|  |             "--skip", "*.css", | ||||||
|  |           ] | ||||||
|     exclude: locale|kickstarter-announcement.md|coreapi-0.1.1.js |     exclude: locale|kickstarter-announcement.md|coreapi-0.1.1.js | ||||||
|     additional_dependencies: |     additional_dependencies: | ||||||
|       # python doesn't come with a toml parser prior to 3.11 |       # python doesn't come with a toml parser prior to 3.11 | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								codespell-ignore-words.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								codespell-ignore-words.txt
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | ||||||
|  | Tim | ||||||
|  | assertIn | ||||||
|  | IAM | ||||||
|  | endcode | ||||||
|  | deque | ||||||
|  | thead | ||||||
|  | @ -416,7 +416,7 @@ JSON Web Token is a fairly new standard which can be used for token-based authen | ||||||
| 
 | 
 | ||||||
| ## Hawk HTTP Authentication | ## Hawk HTTP Authentication | ||||||
| 
 | 
 | ||||||
| The [HawkREST][hawkrest] library builds on the [Mohawk][mohawk] library to let you work with [Hawk][hawk] signed requests and responses in your API. [Hawk][hawk] lets two parties securely communicate with each other using messages signed by a shared key. It is based on [HTTP MAC access authentication][mac] (which was based on parts of [OAuth 1.0][oauth-1.0a]). | The [HawkREST][hawkrest] library builds on the [Mohawk][mohawk] library to let you work with [Hawk][hawk] signed requests and responses in your API. [Hawk][hawk] let's two parties securely communicate with each other using messages signed by a shared key. It is based on [HTTP MAC access authentication][mac] (which was based on parts of [OAuth 1.0][oauth-1.0a]). | ||||||
| 
 | 
 | ||||||
| ## HTTP Signature Authentication | ## HTTP Signature Authentication | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -180,7 +180,7 @@ The `allow_null` option is also available for string fields, although its usage | ||||||
| 
 | 
 | ||||||
| ## EmailField | ## EmailField | ||||||
| 
 | 
 | ||||||
| A text representation, validates the text to be a valid e-mail address. | A text representation, validates the text to be a valid email address. | ||||||
| 
 | 
 | ||||||
| Corresponds to `django.db.models.fields.EmailField` | Corresponds to `django.db.models.fields.EmailField` | ||||||
| 
 | 
 | ||||||
|  | @ -762,7 +762,7 @@ suitable for updating our target object. With `source='*'`, the return from | ||||||
|                      ('y_coordinate', 4), |                      ('y_coordinate', 4), | ||||||
|                      ('x_coordinate', 3)]) |                      ('x_coordinate', 3)]) | ||||||
| 
 | 
 | ||||||
| For completeness lets do the same thing again but with the nested serializer | For completeness let's do the same thing again but with the nested serializer | ||||||
| approach suggested above: | approach suggested above: | ||||||
| 
 | 
 | ||||||
|     class NestedCoordinateSerializer(serializers.Serializer): |     class NestedCoordinateSerializer(serializers.Serializer): | ||||||
|  |  | ||||||
|  | @ -300,7 +300,7 @@ For example, the following serializer: | ||||||
| 
 | 
 | ||||||
| Would serialize to a nested representation like this: | Would serialize to a nested representation like this: | ||||||
| 
 | 
 | ||||||
|     >>> album = Album.objects.create(album_name="The Grey Album", artist='Danger Mouse') |     >>> album = Album.objects.create(album_name="The Gray Album", artist='Danger Mouse') | ||||||
|     >>> Track.objects.create(album=album, order=1, title='Public Service Announcement', duration=245) |     >>> Track.objects.create(album=album, order=1, title='Public Service Announcement', duration=245) | ||||||
|     <Track: Track object> |     <Track: Track object> | ||||||
|     >>> Track.objects.create(album=album, order=2, title='What More Can I Say', duration=264) |     >>> Track.objects.create(album=album, order=2, title='What More Can I Say', duration=264) | ||||||
|  | @ -310,7 +310,7 @@ Would serialize to a nested representation like this: | ||||||
|     >>> serializer = AlbumSerializer(instance=album) |     >>> serializer = AlbumSerializer(instance=album) | ||||||
|     >>> serializer.data |     >>> serializer.data | ||||||
|     { |     { | ||||||
|         'album_name': 'The Grey Album', |         'album_name': 'The Gray Album', | ||||||
|         'artist': 'Danger Mouse', |         'artist': 'Danger Mouse', | ||||||
|         'tracks': [ |         'tracks': [ | ||||||
|             {'order': 1, 'title': 'Public Service Announcement', 'duration': 245}, |             {'order': 1, 'title': 'Public Service Announcement', 'duration': 245}, | ||||||
|  | @ -344,7 +344,7 @@ By default nested serializers are read-only. If you want to support write-operat | ||||||
|             return album |             return album | ||||||
| 
 | 
 | ||||||
|     >>> data = { |     >>> data = { | ||||||
|         'album_name': 'The Grey Album', |         'album_name': 'The Gray Album', | ||||||
|         'artist': 'Danger Mouse', |         'artist': 'Danger Mouse', | ||||||
|         'tracks': [ |         'tracks': [ | ||||||
|             {'order': 1, 'title': 'Public Service Announcement', 'duration': 245}, |             {'order': 1, 'title': 'Public Service Announcement', 'duration': 245}, | ||||||
|  |  | ||||||
|  | @ -134,7 +134,7 @@ An example of a view that uses `TemplateHTMLRenderer`: | ||||||
| 
 | 
 | ||||||
| You can use `TemplateHTMLRenderer` either to return regular HTML pages using REST framework, or to return both HTML and API responses from a single endpoint. | You can use `TemplateHTMLRenderer` either to return regular HTML pages using REST framework, or to return both HTML and API responses from a single endpoint. | ||||||
| 
 | 
 | ||||||
| If you're building websites that use `TemplateHTMLRenderer` along with other renderer classes, you should consider listing `TemplateHTMLRenderer` as the first class in the `renderer_classes` list, so that it will be prioritised first even for browsers that send poorly formed `ACCEPT:` headers. | If you're building websites that use `TemplateHTMLRenderer` along with other renderer classes, you should consider listing `TemplateHTMLRenderer` as the first class in the `renderer_classes` list, so that it will be prioritized first even for browsers that send poorly formed `ACCEPT:` headers. | ||||||
| 
 | 
 | ||||||
| See the [_HTML & Forms_ Topic Page][html-and-forms] for further examples of `TemplateHTMLRenderer` usage. | See the [_HTML & Forms_ Topic Page][html-and-forms] for further examples of `TemplateHTMLRenderer` usage. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -11,7 +11,7 @@ source: | ||||||
| 
 | 
 | ||||||
| REST framework supports HTTP content negotiation by providing a `Response` class which allows you to return content that can be rendered into multiple content types, depending on the client request. | REST framework supports HTTP content negotiation by providing a `Response` class which allows you to return content that can be rendered into multiple content types, depending on the client request. | ||||||
| 
 | 
 | ||||||
| The `Response` class subclasses Django's `SimpleTemplateResponse`.  `Response` objects are initialised with data, which should consist of native Python primitives.  REST framework then uses standard HTTP content negotiation to determine how it should render the final response content. | The `Response` class subclasses Django's `SimpleTemplateResponse`.  `Response` objects are initialized with data, which should consist of native Python primitives.  REST framework then uses standard HTTP content negotiation to determine how it should render the final response content. | ||||||
| 
 | 
 | ||||||
| There's no requirement for you to use the `Response` class, you can also return regular `HttpResponse` or `StreamingHttpResponse` objects from your views if required.  Using the `Response` class simply provides a nicer interface for returning content-negotiated Web API responses, that can be rendered to multiple formats. | There's no requirement for you to use the `Response` class, you can also return regular `HttpResponse` or `StreamingHttpResponse` objects from your views if required.  Using the `Response` class simply provides a nicer interface for returning content-negotiated Web API responses, that can be rendered to multiple formats. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -20,7 +20,7 @@ package and then subsequently retired over the next releases. | ||||||
| 
 | 
 | ||||||
| As a full-fledged replacement, we recommend the [drf-spectacular] package. | As a full-fledged replacement, we recommend the [drf-spectacular] package. | ||||||
| It has extensive support for generating OpenAPI 3 schemas from | It has extensive support for generating OpenAPI 3 schemas from | ||||||
| REST framework APIs, with both automatic and customisable options available. | REST framework APIs, with both automatic and customizable options available. | ||||||
| For further information please refer to | For further information please refer to | ||||||
| [Documenting your API](../topics/documenting-your-api.md#drf-spectacular). | [Documenting your API](../topics/documenting-your-api.md#drf-spectacular). | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -48,7 +48,7 @@ We can now use `CommentSerializer` to serialize a comment, or list of comments. | ||||||
|     serializer.data |     serializer.data | ||||||
|     # {'email': 'leila@example.com', 'content': 'foo bar', 'created': '2016-01-27T15:17:10.375877'} |     # {'email': 'leila@example.com', 'content': 'foo bar', 'created': '2016-01-27T15:17:10.375877'} | ||||||
| 
 | 
 | ||||||
| At this point we've translated the model instance into Python native datatypes.  To finalise the serialization process we render the data into `json`. | At this point we've translated the model instance into Python native datatypes.  To finalize the serialization process we render the data into `json`. | ||||||
| 
 | 
 | ||||||
|     from rest_framework.renderers import JSONRenderer |     from rest_framework.renderers import JSONRenderer | ||||||
| 
 | 
 | ||||||
|  | @ -155,7 +155,7 @@ When deserializing data, you always need to call `is_valid()` before attempting | ||||||
|     serializer.is_valid() |     serializer.is_valid() | ||||||
|     # False |     # False | ||||||
|     serializer.errors |     serializer.errors | ||||||
|     # {'email': ['Enter a valid e-mail address.'], 'created': ['This field is required.']} |     # {'email': ['Enter a valid email address.'], 'created': ['This field is required.']} | ||||||
| 
 | 
 | ||||||
| Each key in the dictionary will be the field name, and the values will be lists of strings of any error messages corresponding to that field.  The `non_field_errors` key may also be present, and will list any general validation errors. The name of the `non_field_errors` key may be customized using the `NON_FIELD_ERRORS_KEY` REST framework setting. | Each key in the dictionary will be the field name, and the values will be lists of strings of any error messages corresponding to that field.  The `non_field_errors` key may also be present, and will list any general validation errors. The name of the `non_field_errors` key may be customized using the `NON_FIELD_ERRORS_KEY` REST framework setting. | ||||||
| 
 | 
 | ||||||
|  | @ -298,7 +298,7 @@ When dealing with nested representations that support deserializing the data, an | ||||||
|     serializer.is_valid() |     serializer.is_valid() | ||||||
|     # False |     # False | ||||||
|     serializer.errors |     serializer.errors | ||||||
|     # {'user': {'email': ['Enter a valid e-mail address.']}, 'created': ['This field is required.']} |     # {'user': {'email': ['Enter a valid email address.']}, 'created': ['This field is required.']} | ||||||
| 
 | 
 | ||||||
| Similarly, the `.validated_data` property will include nested data structures. | Similarly, the `.validated_data` property will include nested data structures. | ||||||
| 
 | 
 | ||||||
|  | @ -430,7 +430,7 @@ The context dictionary can be used within any serializer field logic, such as a | ||||||
| 
 | 
 | ||||||
| Often you'll want serializer classes that map closely to Django model definitions. | Often you'll want serializer classes that map closely to Django model definitions. | ||||||
| 
 | 
 | ||||||
| The `ModelSerializer` class provides a shortcut that lets you automatically create a `Serializer` class with fields that correspond to the Model fields. | The `ModelSerializer` class provides a shortcut that let's you automatically create a `Serializer` class with fields that correspond to the Model fields. | ||||||
| 
 | 
 | ||||||
| **The `ModelSerializer` class is the same as a regular `Serializer` class, except that**: | **The `ModelSerializer` class is the same as a regular `Serializer` class, except that**: | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -264,7 +264,7 @@ For example... | ||||||
|     csrftoken = response.cookies['csrftoken'] |     csrftoken = response.cookies['csrftoken'] | ||||||
| 
 | 
 | ||||||
|     # Interact with the API. |     # Interact with the API. | ||||||
|     response = client.post('http://testserver/organisations/', json={ |     response = client.post('http://testserver/organizations/', json={ | ||||||
|         'name': 'MegaCorp', |         'name': 'MegaCorp', | ||||||
|         'status': 'active' |         'status': 'active' | ||||||
|     }, headers={'X-CSRFToken': csrftoken}) |     }, headers={'X-CSRFToken': csrftoken}) | ||||||
|  | @ -292,12 +292,12 @@ The CoreAPIClient allows you to interact with your API using the Python | ||||||
|     client = CoreAPIClient() |     client = CoreAPIClient() | ||||||
|     schema = client.get('http://testserver/schema/') |     schema = client.get('http://testserver/schema/') | ||||||
| 
 | 
 | ||||||
|     # Create a new organisation |     # Create a new organization | ||||||
|     params = {'name': 'MegaCorp', 'status': 'active'} |     params = {'name': 'MegaCorp', 'status': 'active'} | ||||||
|     client.action(schema, ['organisations', 'create'], params) |     client.action(schema, ['organizations', 'create'], params) | ||||||
| 
 | 
 | ||||||
|     # Ensure that the organisation exists in the listing |     # Ensure that the organization exists in the listing | ||||||
|     data = client.action(schema, ['organisations', 'list']) |     data = client.action(schema, ['organizations', 'list']) | ||||||
|     assert(len(data) == 1) |     assert(len(data) == 1) | ||||||
|     assert(data == [{'name': 'MegaCorp', 'status': 'active'}]) |     assert(data == [{'name': 'MegaCorp', 'status': 'active'}]) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -175,7 +175,7 @@ If you want the date field to be entirely hidden from the user, then use `Hidden | ||||||
| Validators that are applied across multiple fields in the serializer can sometimes require a field input that should not be provided by the API client, but that *is* available as input to the validator. | Validators that are applied across multiple fields in the serializer can sometimes require a field input that should not be provided by the API client, but that *is* available as input to the validator. | ||||||
| For this purposes use `HiddenField`. This field will be present in `validated_data` but *will not* be used in the serializer output representation. | For this purposes use `HiddenField`. This field will be present in `validated_data` but *will not* be used in the serializer output representation. | ||||||
| 
 | 
 | ||||||
| **Note:** Using a `read_only=True` field is excluded from writable fields so it won't use a `default=…` argument. Look [3.8 announcement](https://www.django-rest-framework.org/community/3.8-announcement/#altered-the-behaviour-of-read_only-plus-default-on-field). | **Note:** Using a `read_only=True` field is excluded from writable fields so it won't use a `default=…` argument. Look [3.8 announcement](https://www.django-rest-framework.org/community/3.8-announcement/#altered-the-behavior-of-read_only-plus-default-on-field). | ||||||
| 
 | 
 | ||||||
| REST framework includes a couple of defaults that may be useful in this context. | REST framework includes a couple of defaults that may be useful in this context. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -632,7 +632,7 @@ The `MultipleChoiceField` class has been added. This field acts like `ChoiceFiel | ||||||
| 
 | 
 | ||||||
| The `from_native(self, value)` and `to_native(self, data)` method names have been replaced with the more obviously named `to_internal_value(self, data)` and `to_representation(self, value)`. | The `from_native(self, value)` and `to_native(self, data)` method names have been replaced with the more obviously named `to_internal_value(self, data)` and `to_representation(self, value)`. | ||||||
| 
 | 
 | ||||||
| The `field_from_native()` and `field_to_native()` methods are removed. Previously you could use these methods if you wanted to customise the behavior in a way that did not simply lookup the field value from the object. For example... | The `field_from_native()` and `field_to_native()` methods are removed. Previously you could use these methods if you wanted to customize the behavior in a way that did not simply lookup the field value from the object. For example... | ||||||
| 
 | 
 | ||||||
|     def field_to_native(self, obj, field_name): |     def field_to_native(self, obj, field_name): | ||||||
|         """A custom read-only field that returns the class name.""" |         """A custom read-only field that returns the class name.""" | ||||||
|  |  | ||||||
|  | @ -50,7 +50,7 @@ See [the schema documentation](https://www.django-rest-framework.org/api-guide/s | ||||||
| ## Customizing the operation ID. | ## Customizing the operation ID. | ||||||
| 
 | 
 | ||||||
| REST framework automatically determines operation IDs to use in OpenAPI | REST framework automatically determines operation IDs to use in OpenAPI | ||||||
| schemas. The latest version provides more control for overriding the behaviour | schemas. The latest version provides more control for overriding the behavior | ||||||
| used to generate the operation IDs. | used to generate the operation IDs. | ||||||
| 
 | 
 | ||||||
| See [the schema documentation](https://www.django-rest-framework.org/api-guide/schemas/#operationid) for more information. | See [the schema documentation](https://www.django-rest-framework.org/api-guide/schemas/#operationid) for more information. | ||||||
|  | @ -96,7 +96,7 @@ for details on using custom `AutoSchema` subclasses. | ||||||
| ## Support for JSONField. | ## Support for JSONField. | ||||||
| 
 | 
 | ||||||
| Django 3.1 deprecated the existing `django.contrib.postgres.fields.JSONField` | Django 3.1 deprecated the existing `django.contrib.postgres.fields.JSONField` | ||||||
| in favour of a new database-agnositic `JSONField`. | in favor of a new database-agnositic `JSONField`. | ||||||
| 
 | 
 | ||||||
| REST framework 3.12 now supports this new model field, and `ModelSerializer` | REST framework 3.12 now supports this new model field, and `ModelSerializer` | ||||||
| classes will correctly map the model field. | classes will correctly map the model field. | ||||||
|  |  | ||||||
|  | @ -50,6 +50,6 @@ They must now use the more explicit keyword argument style... | ||||||
| aliases = serializers.ListField(child=serializers.CharField()) | aliases = serializers.ListField(child=serializers.CharField()) | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| This change has been made because using positional arguments here *does not* result in the expected behaviour. | This change has been made because using positional arguments here *does not* result in the expected behavior. | ||||||
| 
 | 
 | ||||||
| See Pull Request [#7632](https://github.com/encode/django-rest-framework/pull/7632) for more details. | See Pull Request [#7632](https://github.com/encode/django-rest-framework/pull/7632) for more details. | ||||||
|  |  | ||||||
|  | @ -39,12 +39,12 @@ By default the URLs created by `SimpleRouter` use regular expressions. This beha | ||||||
| 
 | 
 | ||||||
| Dependency on pytz has been removed and deprecation warnings have been added, Django will provide ZoneInfo instances as long as USE_DEPRECATED_PYTZ is not enabled. More info on the migration can be found [in this guide](https://pytz-deprecation-shim.readthedocs.io/en/latest/migration.html). | Dependency on pytz has been removed and deprecation warnings have been added, Django will provide ZoneInfo instances as long as USE_DEPRECATED_PYTZ is not enabled. More info on the migration can be found [in this guide](https://pytz-deprecation-shim.readthedocs.io/en/latest/migration.html). | ||||||
| 
 | 
 | ||||||
| ##  Align `SearchFilter` behaviour to `django.contrib.admin` search | ##  Align `SearchFilter` behavior to `django.contrib.admin` search | ||||||
| 
 | 
 | ||||||
| Searches now may contain _quoted phrases_ with spaces, each phrase is considered as a single search term, and it will raise a validation error if any null-character is provided in search. See the [Filtering API guide](../api-guide/filtering.md) for more information. | Searches now may contain _quoted phrases_ with spaces, each phrase is considered as a single search term, and it will raise a validation error if any null-character is provided in search. See the [Filtering API guide](../api-guide/filtering.md) for more information. | ||||||
| 
 | 
 | ||||||
| ## Other fixes and improvements | ## Other fixes and improvements | ||||||
| 
 | 
 | ||||||
| There are a number of fixes and minor improvements in this release, ranging from documentation, internal infrastructure (typing, testing, requirements, deprecation, etc.), security and overall behaviour. | There are a number of 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. | See the [release notes](release-notes.md) page for a complete listing. | ||||||
|  |  | ||||||
|  | @ -29,7 +29,7 @@ The current minimum versions of Django is now 4.2 and Python 3.9. | ||||||
| 
 | 
 | ||||||
| ## Django LoginRequiredMiddleware | ## Django LoginRequiredMiddleware | ||||||
| 
 | 
 | ||||||
| The new `LoginRequiredMiddleware` introduced by Django 5.1 can now be used alongside Django REST Framework, however it is not honored for API views as an equivalent behaviour can be configured via `DEFAULT_AUTHENTICATION_CLASSES`. See [our dedicated section](../api-guide/authentication.md#django-51-loginrequiredmiddleware) in the docs for more information. | The new `LoginRequiredMiddleware` introduced by Django 5.1 can now be used alongside Django REST Framework, however it is not honored for API views as an equivalent behavior can be configured via `DEFAULT_AUTHENTICATION_CLASSES`. See [our dedicated section](../api-guide/authentication.md#django-51-loginrequiredmiddleware) in the docs for more information. | ||||||
| 
 | 
 | ||||||
| ## Improved support for UniqueConstraint | ## Improved support for UniqueConstraint | ||||||
| 
 | 
 | ||||||
|  | @ -37,6 +37,6 @@ The generation of validators for [UniqueConstraint](https://docs.djangoproject.c | ||||||
| 
 | 
 | ||||||
| ## Other fixes and improvements | ## Other fixes and improvements | ||||||
| 
 | 
 | ||||||
| There are a number of fixes and minor improvements in this release, ranging from documentation, internal infrastructure (typing, testing, requirements, deprecation, etc.), security and overall behaviour. | There are a number of 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. | See the [release notes](release-notes.md) page for a complete listing. | ||||||
|  |  | ||||||
|  | @ -157,7 +157,7 @@ will result in a list of the available choices being returned in the response. | ||||||
| In cases where there is a relational field, the previous behavior would be | In cases where there is a relational field, the previous behavior would be | ||||||
| to return a list of available instances to choose from for that relational field. | to return a list of available instances to choose from for that relational field. | ||||||
| 
 | 
 | ||||||
| In order to minimise exposed information the behavior now is to *not* return | In order to minimize exposed information the behavior now is to *not* return | ||||||
| choices information for relational fields. | choices information for relational fields. | ||||||
| 
 | 
 | ||||||
| If you want to override this new behavior you'll need to [implement a custom | If you want to override this new behavior you'll need to [implement a custom | ||||||
|  |  | ||||||
|  | @ -81,7 +81,7 @@ a dynamic client library to interact with your API. | ||||||
| 
 | 
 | ||||||
| Finally, we're also now exposing the schema generation as a | Finally, we're also now exposing the schema generation as a | ||||||
| [publicly documented API][schema-generation-api], allowing you to more easily | [publicly documented API][schema-generation-api], allowing you to more easily | ||||||
| override the behaviour. | override the behavior. | ||||||
| 
 | 
 | ||||||
| ## Requests test client | ## Requests test client | ||||||
| 
 | 
 | ||||||
|  | @ -106,12 +106,12 @@ client library. | ||||||
|     client = CoreAPIClient() |     client = CoreAPIClient() | ||||||
|     schema = client.get('http://testserver/schema/') |     schema = client.get('http://testserver/schema/') | ||||||
| 
 | 
 | ||||||
|     # Create a new organisation |     # Create a new organization | ||||||
|     params = {'name': 'MegaCorp', 'status': 'active'} |     params = {'name': 'MegaCorp', 'status': 'active'} | ||||||
|     client.action(schema, ['organisations', 'create'], params) |     client.action(schema, ['organizations', 'create'], params) | ||||||
| 
 | 
 | ||||||
|     # Ensure that the organisation exists in the listing |     # Ensure that the organization exists in the listing | ||||||
|     data = client.action(schema, ['organisations', 'list']) |     data = client.action(schema, ['organizations', 'list']) | ||||||
|     assert(len(data) == 1) |     assert(len(data) == 1) | ||||||
|     assert(data == [{'name': 'MegaCorp', 'status': 'active'}]) |     assert(data == [{'name': 'MegaCorp', 'status': 'active'}]) | ||||||
| 
 | 
 | ||||||
|  | @ -204,10 +204,10 @@ The `'pk'` identifier in schema paths is now mapped onto the actually model fiel | ||||||
| name by default. This will typically be `'id'`. | name by default. This will typically be `'id'`. | ||||||
| 
 | 
 | ||||||
| This gives a better external representation for schemas, with less implementation | This gives a better external representation for schemas, with less implementation | ||||||
| detail being exposed. It also reflects the behaviour of using a ModelSerializer | detail being exposed. It also reflects the behavior of using a ModelSerializer | ||||||
| class with `fields = '__all__'`. | class with `fields = '__all__'`. | ||||||
| 
 | 
 | ||||||
| You can revert to the previous behaviour by setting `'SCHEMA_COERCE_PATH_PK': False` | You can revert to the previous behavior by setting `'SCHEMA_COERCE_PATH_PK': False` | ||||||
| in the REST framework settings. | in the REST framework settings. | ||||||
| 
 | 
 | ||||||
| ### Schema action name representations | ### Schema action name representations | ||||||
|  | @ -215,7 +215,7 @@ in the REST framework settings. | ||||||
| The internal `retrieve()` and `destroy()` method names are now coerced to an | The internal `retrieve()` and `destroy()` method names are now coerced to an | ||||||
| external representation of `read` and `delete`. | external representation of `read` and `delete`. | ||||||
| 
 | 
 | ||||||
| You can revert to the previous behaviour by setting `'SCHEMA_COERCE_METHOD_NAMES': {}` | You can revert to the previous behavior by setting `'SCHEMA_COERCE_METHOD_NAMES': {}` | ||||||
| in the REST framework settings. | in the REST framework settings. | ||||||
| 
 | 
 | ||||||
| ### DjangoFilterBackend | ### DjangoFilterBackend | ||||||
|  |  | ||||||
|  | @ -53,7 +53,7 @@ In order to try to address this we're now adding the ability for per-view custom | ||||||
| 
 | 
 | ||||||
| Let's take a quick look at using the new functionality... | Let's take a quick look at using the new functionality... | ||||||
| 
 | 
 | ||||||
| The `APIView` class has a `schema` attribute, that is used to control how the Schema for that particular view is generated. The default behaviour is to use the `AutoSchema` class. | The `APIView` class has a `schema` attribute, that is used to control how the Schema for that particular view is generated. The default behavior is to use the `AutoSchema` class. | ||||||
| 
 | 
 | ||||||
|     from rest_framework.views import APIView |     from rest_framework.views import APIView | ||||||
|     from rest_framework.schemas import AutoSchema |     from rest_framework.schemas import AutoSchema | ||||||
|  |  | ||||||
|  | @ -36,7 +36,7 @@ If you use REST framework commercially and would like to see this work continue, | ||||||
| 
 | 
 | ||||||
| ## Breaking Changes | ## Breaking Changes | ||||||
| 
 | 
 | ||||||
| ### Altered the behaviour of `read_only` plus `default` on Field. | ### Altered the behavior of `read_only` plus `default` on Field. | ||||||
| 
 | 
 | ||||||
| [#5886][gh5886] `read_only` fields will now **always** be excluded from writable fields. | [#5886][gh5886] `read_only` fields will now **always** be excluded from writable fields. | ||||||
| 
 | 
 | ||||||
|  | @ -44,7 +44,7 @@ Previously `read_only` fields when combined with a `default` value would use the | ||||||
| operations. This was counter-intuitive in some circumstances and led to difficulties supporting dotted `source` | operations. This was counter-intuitive in some circumstances and led to difficulties supporting dotted `source` | ||||||
| attributes on nullable relations. | attributes on nullable relations. | ||||||
| 
 | 
 | ||||||
| In order to maintain the old behaviour you may need to pass the value of `read_only` fields when calling `save()` in | In order to maintain the old behavior you may need to pass the value of `read_only` fields when calling `save()` in | ||||||
| the view: | the view: | ||||||
| 
 | 
 | ||||||
|     def perform_create(self, serializer): |     def perform_create(self, serializer): | ||||||
|  |  | ||||||
|  | @ -152,7 +152,7 @@ See [#5990][gh5990]. | ||||||
| 
 | 
 | ||||||
| ### `action` decorator replaces `list_route` and `detail_route` | ### `action` decorator replaces `list_route` and `detail_route` | ||||||
| 
 | 
 | ||||||
| Both `list_route` and `detail_route` are now deprecated in favour of the single `action` decorator. | Both `list_route` and `detail_route` are now deprecated in favor of the single `action` decorator. | ||||||
| They will be removed entirely in 3.10. | They will be removed entirely in 3.10. | ||||||
| 
 | 
 | ||||||
| The `action` decorator takes a boolean `detail` argument. | The `action` decorator takes a boolean `detail` argument. | ||||||
|  |  | ||||||
|  | @ -105,7 +105,7 @@ This release fixes a few bugs, clean-up some old code paths for unsupported Pyth | ||||||
| 
 | 
 | ||||||
| **Date**: 28th March 2025 | **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 behaviour of existing features and pre-existing behaviour. Specifically, some fixes were added to around the support of `UniqueConstraint` with nullable fields which will improve built-in serializer validation. | 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. | ||||||
| 
 | 
 | ||||||
| #### Features | #### Features | ||||||
| 
 | 
 | ||||||
|  | @ -215,7 +215,7 @@ Date: 15th March 2024 | ||||||
| * Partial serializer should not have required fields [[#7563](https://github.com/encode/django-rest-framework/pull/7563)] | * Partial serializer should not have required fields [[#7563](https://github.com/encode/django-rest-framework/pull/7563)] | ||||||
| * Propagate 'default' from model field to serializer field. [[#9030](https://github.com/encode/django-rest-framework/pull/9030)] | * Propagate 'default' from model field to serializer field. [[#9030](https://github.com/encode/django-rest-framework/pull/9030)] | ||||||
| * Allow to override child.run_validation call in ListSerializer [[#8035](https://github.com/encode/django-rest-framework/pull/8035)] | * Allow to override child.run_validation call in ListSerializer [[#8035](https://github.com/encode/django-rest-framework/pull/8035)] | ||||||
| * Align SearchFilter behaviour to django.contrib.admin search [[#9017](https://github.com/encode/django-rest-framework/pull/9017)] | * Align SearchFilter behavior to django.contrib.admin search [[#9017](https://github.com/encode/django-rest-framework/pull/9017)] | ||||||
| * Class name added to unknown field error [[#9019](https://github.com/encode/django-rest-framework/pull/9019)] | * Class name added to unknown field error [[#9019](https://github.com/encode/django-rest-framework/pull/9019)] | ||||||
| * Fix: Pagination response schemas. [[#9049](https://github.com/encode/django-rest-framework/pull/9049)] | * Fix: Pagination response schemas. [[#9049](https://github.com/encode/django-rest-framework/pull/9049)] | ||||||
| * Fix choices in ChoiceField to support IntEnum [[#8955](https://github.com/encode/django-rest-framework/pull/8955)] | * Fix choices in ChoiceField to support IntEnum [[#8955](https://github.com/encode/django-rest-framework/pull/8955)] | ||||||
|  | @ -369,7 +369,7 @@ Date: 28th September 2020 | ||||||
| 
 | 
 | ||||||
| * Add `--file` option to `generateschema` command. [#7130] | * Add `--file` option to `generateschema` command. [#7130] | ||||||
| * Support `tags` for OpenAPI schema generation. See [the schema docs](https://www.django-rest-framework.org/api-guide/schemas/#grouping-operations-with-tags). [#7184] | * Support `tags` for OpenAPI schema generation. See [the schema docs](https://www.django-rest-framework.org/api-guide/schemas/#grouping-operations-with-tags). [#7184] | ||||||
| * Support customising the operation ID for schema generation. See [the schema docs](https://www.django-rest-framework.org/api-guide/schemas/#operationid). [#7190] | * Support customizing the operation ID for schema generation. See [the schema docs](https://www.django-rest-framework.org/api-guide/schemas/#operationid). [#7190] | ||||||
| * Support OpenAPI components for schema generation. See [the schema docs](https://www.django-rest-framework.org/api-guide/schemas/#components). [#7124] | * Support OpenAPI components for schema generation. See [the schema docs](https://www.django-rest-framework.org/api-guide/schemas/#components). [#7124] | ||||||
| * The following methods on `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 docs](https://www.django-rest-framework.org/api-guide/schemas/#autoschema) | * The following methods on `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 docs](https://www.django-rest-framework.org/api-guide/schemas/#autoschema) | ||||||
| * Add support for Django 3.1's database-agnositic `JSONField`. [#7467] | * Add support for Django 3.1's database-agnositic `JSONField`. [#7467] | ||||||
|  | @ -407,7 +407,7 @@ Date: 28th September 2020 | ||||||
| * Fix `PrimaryKeyRelatedField` and `HyperlinkedRelatedField` when source field is actually a property. [#7142] | * Fix `PrimaryKeyRelatedField` and `HyperlinkedRelatedField` when source field is actually a property. [#7142] | ||||||
| * `Token.generate_key` is now a class method. [#7502] | * `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] | * `@action` warns if method is wrapped in a decorator that does not preserve information using `@functools.wraps`. [#7098] | ||||||
| * Deprecate `serializers.NullBooleanField` in favour of `serializers.BooleanField` with `allow_null=True` [#7122] | * Deprecate `serializers.NullBooleanField` in favor of `serializers.BooleanField` with `allow_null=True` [#7122] | ||||||
| 
 | 
 | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  | @ -417,7 +417,7 @@ Date: 28th September 2020 | ||||||
| 
 | 
 | ||||||
| **Date**: 30th September 2020 | **Date**: 30th September 2020 | ||||||
| 
 | 
 | ||||||
| * **Security**: Drop `urlize_quoted_links` template tag in favour of Django's built-in `urlize`. Removes a XSS vulnerability for some kinds of content in the browsable API. | * **Security**: Drop `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. | ||||||
| 
 | 
 | ||||||
| ### 3.11.1 | ### 3.11.1 | ||||||
| 
 | 
 | ||||||
|  | @ -429,7 +429,7 @@ Date: 28th September 2020 | ||||||
| 
 | 
 | ||||||
| **Date**: 12th December 2019 | **Date**: 12th December 2019 | ||||||
| 
 | 
 | ||||||
| * Drop `.set_context` API [in favour of a `requires_context` marker](3.11-announcement.md#validator-default-context). | * Drop `.set_context` API [in favor of a `requires_context` marker](3.11-announcement.md#validator-default-context). | ||||||
| * Changed default widget for TextField with choices to select box. [#6892][gh6892] | * Changed default widget for TextField with choices to select box. [#6892][gh6892] | ||||||
| * Supported nested writes on non-relational fields, such as JSONField. [#6916][gh6916] | * Supported nested writes on non-relational fields, such as JSONField. [#6916][gh6916] | ||||||
| * Include request/response media types in OpenAPI schemas, based on configured parsers/renderers. [#6865][gh6865] | * Include request/response media types in OpenAPI schemas, based on configured parsers/renderers. [#6865][gh6865] | ||||||
|  | @ -621,13 +621,13 @@ Be sure to upgrade to Python 3 before upgrading to Django REST Framework 3.10. | ||||||
| **Date**: [3rd April 2018][3.8.0-milestone] | **Date**: [3rd April 2018][3.8.0-milestone] | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| * **Breaking Change**: Alter `read_only` plus `default` behaviour. [#5886][gh5886] | * **Breaking Change**: Alter `read_only` plus `default` behavior. [#5886][gh5886] | ||||||
| 
 | 
 | ||||||
|     `read_only` fields will now **always** be excluded from writable fields. |     `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. |     Previously `read_only` fields with a `default` value would use the `default` for create and update operations. | ||||||
| 
 | 
 | ||||||
|     In order to maintain the old behaviour you may need to pass the value of `read_only` fields when calling `save()` in |     In order to maintain the old behavior you may need to pass the value of `read_only` fields when calling `save()` in | ||||||
|     the view: |     the view: | ||||||
| 
 | 
 | ||||||
|         def perform_create(self, serializer): |         def perform_create(self, serializer): | ||||||
|  | @ -635,13 +635,13 @@ Be sure to upgrade to Python 3 before upgrading to Django REST Framework 3.10. | ||||||
| 
 | 
 | ||||||
|     Alternatively you may override `save()` or `create()` or `update()` on the serializer as appropriate. |     Alternatively you may override `save()` or `create()` or `update()` on the serializer as appropriate. | ||||||
| 
 | 
 | ||||||
| * Correct allow_null behaviour when required=False [#5888][gh5888] | * Correct allow_null behavior when required=False [#5888][gh5888] | ||||||
| 
 | 
 | ||||||
|     Without an explicit `default`, `allow_null` implies a default of `null` for outgoing serialization. Previously such |     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. |     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 |     **Possible backwards compatibility break** if you were relying on such fields being excluded from the outgoing | ||||||
|     representation. In order to restore the old behaviour you can override `data` to exclude the field when `None`. |     representation. In order to restore the old behavior you can override `data` to exclude the field when `None`. | ||||||
| 
 | 
 | ||||||
|     For example: |     For example: | ||||||
| 
 | 
 | ||||||
|  | @ -698,7 +698,7 @@ Be sure to upgrade to Python 3 before upgrading to Django REST Framework 3.10. | ||||||
| * Add HStoreField, postgres fields tests [#5654][gh5654] | * Add HStoreField, postgres fields tests [#5654][gh5654] | ||||||
| * Always fully qualify ValidationError in docs [#5751][gh5751] | * Always fully qualify ValidationError in docs [#5751][gh5751] | ||||||
| * Remove unreachable code from ManualSchema [#5766][gh5766] | * Remove unreachable code from ManualSchema [#5766][gh5766] | ||||||
| * Allowed customising API documentation code samples [#5752][gh5752] | * Allowed customizing API documentation code samples [#5752][gh5752] | ||||||
| * Updated docs to use `pip show` [#5757][gh5757] | * Updated docs to use `pip show` [#5757][gh5757] | ||||||
| * Load 'static' instead of 'staticfiles' in templates [#5773][gh5773] | * Load 'static' instead of 'staticfiles' in templates [#5773][gh5773] | ||||||
| * Fixed a typo in `fields` docs [#5783][gh5783] | * Fixed a typo in `fields` docs [#5783][gh5783] | ||||||
|  | @ -761,7 +761,7 @@ Be sure to upgrade to Python 3 before upgrading to Django REST Framework 3.10. | ||||||
| 
 | 
 | ||||||
| * Schema: Extract method for `manual_fields` processing [#5633][gh5633] | * Schema: Extract method for `manual_fields` processing [#5633][gh5633] | ||||||
| 
 | 
 | ||||||
|     Allows for easier customisation of `manual_fields` processing, for example |     Allows for easier customization of `manual_fields` processing, for example | ||||||
|     to provide per-method manual fields. `AutoSchema` adds `get_manual_fields`, |     to provide per-method manual fields. `AutoSchema` adds `get_manual_fields`, | ||||||
|     as the intended override point, and a utility method `update_fields`, to |     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 |     handle by-name field replacement from a list, which, in general, you are not | ||||||
|  | @ -883,7 +883,7 @@ Be sure to upgrade to Python 3 before upgrading to Django REST Framework 3.10. | ||||||
| * Don't strip microseconds from `time` when encoding. Makes consistent with `datetime`. | * Don't strip microseconds from `time` when encoding. Makes consistent with `datetime`. | ||||||
|     **BC Change**: Previously only milliseconds were encoded. [#5440][gh5440] |     **BC Change**: Previously only milliseconds were encoded. [#5440][gh5440] | ||||||
| * Added `STRICT_JSON` setting (default `True`) to raise exception for the extended float values (`nan`, `inf`, `-inf`) accepted by Python's `json` module. | * 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 behaviour. [#5265][gh5265] |     **BC Change**: Previously these values would converted to corresponding strings. Set `STRICT_JSON` to `False` to restore the previous behavior. [#5265][gh5265] | ||||||
| * Add support for `page_size` parameter in CursorPaginator class [#5250][gh5250] | * Add support for `page_size` parameter in CursorPaginator class [#5250][gh5250] | ||||||
| * Make `DEFAULT_PAGINATION_CLASS` `None` by default. | * 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`. |     **BC Change**: If your were **just** setting `PAGE_SIZE` to enable pagination you will need to add `DEFAULT_PAGINATION_CLASS`. | ||||||
|  | @ -921,10 +921,10 @@ Be sure to upgrade to Python 3 before upgrading to Django REST Framework 3.10. | ||||||
| * Fix naming collisions in Schema Generation [#5464][gh5464] | * Fix naming collisions in Schema Generation [#5464][gh5464] | ||||||
| * Call Django's authenticate function with the request object [#5295][gh5295] | * Call Django's authenticate function with the request object [#5295][gh5295] | ||||||
| * Update coreapi JS to 0.1.1 [#5479][gh5479] | * Update coreapi JS to 0.1.1 [#5479][gh5479] | ||||||
| * Have `is_list_view` recognise RetrieveModel… views [#5480][gh5480] | * Have `is_list_view` recognize RetrieveModel… views [#5480][gh5480] | ||||||
| * Remove Django 1.8 & 1.9 compatibility code [#5481][gh5481] | * Remove Django 1.8 & 1.9 compatibility code [#5481][gh5481] | ||||||
| * Remove deprecated schema code from DefaultRouter [#5482][gh5482] | * Remove deprecated schema code from DefaultRouter [#5482][gh5482] | ||||||
| * Refactor schema generation to allow per-view customisation. | * 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] |     **BC Change**: `SchemaGenerator.get_serializer_fields` has been refactored as `AutoSchema.get_serializer_fields` and drops the `view` argument [#5354][gh5354] | ||||||
| 
 | 
 | ||||||
| ## 3.6.x series | ## 3.6.x series | ||||||
|  |  | ||||||
|  | @ -53,7 +53,7 @@ Some reasons you might want to use REST framework: | ||||||
| * [Serialization][serializers] that supports both [ORM][modelserializer-section] and [non-ORM][serializer-section] data sources. | * [Serialization][serializers] that supports both [ORM][modelserializer-section] and [non-ORM][serializer-section] data sources. | ||||||
| * Customizable all the way down - just use [regular function-based views][functionview-section] if you don't need the [more][generic-views] [powerful][viewsets] [features][routers]. | * Customizable all the way down - just use [regular function-based views][functionview-section] if you don't need the [more][generic-views] [powerful][viewsets] [features][routers]. | ||||||
| * Extensive documentation, and [great community support][group]. | * Extensive documentation, and [great community support][group]. | ||||||
| * Used and trusted by internationally recognised companies including [Mozilla][mozilla], [Red Hat][redhat], [Heroku][heroku], and [Eventbrite][eventbrite]. | * Used and trusted by internationally recognized companies including [Mozilla][mozilla], [Red Hat][redhat], [Heroku][heroku], and [Eventbrite][eventbrite]. | ||||||
| 
 | 
 | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -181,7 +181,7 @@ The context that's available to the template: | ||||||
| * `FORMAT_PARAM`        : The view can accept a format override | * `FORMAT_PARAM`        : The view can accept a format override | ||||||
| * `METHOD_PARAM`        : The view can accept a method override | * `METHOD_PARAM`        : The view can accept a method override | ||||||
| 
 | 
 | ||||||
| You can override the `BrowsableAPIRenderer.get_context()` method to customise the context that gets passed to the template. | You can override the `BrowsableAPIRenderer.get_context()` method to customize the context that gets passed to the template. | ||||||
| 
 | 
 | ||||||
| #### Not using base.html | #### Not using base.html | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -32,7 +32,7 @@ REST framework also includes [serialization] and [parser]/[renderer] components | ||||||
| 
 | 
 | ||||||
| ## What REST framework doesn't provide. | ## What REST framework doesn't provide. | ||||||
| 
 | 
 | ||||||
| What REST framework doesn't do is give you machine readable hypermedia formats such as [HAL][hal], [Collection+JSON][collection], [JSON API][json-api] or HTML [microformats] by default, or the ability to auto-magically create fully HATEOAS style APIs that include hypermedia-based form descriptions and semantically labelled hyperlinks. Doing so would involve making opinionated choices about API design that should really remain outside of the framework's scope. | What REST framework doesn't do is give you machine readable hypermedia formats such as [HAL][hal], [Collection+JSON][collection], [JSON API][json-api] or HTML [microformats] by default, or the ability to auto-magically create fully HATEOAS style APIs that include hypermedia-based form descriptions and semantically labeled hyperlinks. Doing so would involve making opinionated choices about API design that should really remain outside of the framework's scope. | ||||||
| 
 | 
 | ||||||
| [cite]: https://vimeo.com/channels/restfest/49503453 | [cite]: https://vimeo.com/channels/restfest/49503453 | ||||||
| [dissertation]: https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm | [dissertation]: https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| """ | """ | ||||||
| Generic views that provide commonly needed behaviour. | Generic views that provide commonly needed behavior. | ||||||
| """ | """ | ||||||
| from django.core.exceptions import ValidationError | from django.core.exceptions import ValidationError | ||||||
| from django.db.models.query import QuerySet | from django.db.models.query import QuerySet | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| """ | """ | ||||||
| Basic building blocks for generic class based views. | Basic building blocks for generic class based views. | ||||||
| 
 | 
 | ||||||
| We don't bind behaviour to http method handlers yet, | We don't bind behavior to http method handlers yet, | ||||||
| which allows mixin classes to be composed in interesting ways. | which allows mixin classes to be composed in interesting ways. | ||||||
| """ | """ | ||||||
| from rest_framework import status | from rest_framework import status | ||||||
|  |  | ||||||
|  | @ -50,7 +50,7 @@ Position conflicts with coreapi.Link for URL path {target_url}. | ||||||
| Attempted to insert link with keys: {keys}. | Attempted to insert link with keys: {keys}. | ||||||
| 
 | 
 | ||||||
| Adjust URLs to avoid naming collision or override `SchemaGenerator.get_keys()` | Adjust URLs to avoid naming collision or override `SchemaGenerator.get_keys()` | ||||||
| to customise schema structure. | to customize schema structure. | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -513,7 +513,7 @@ class AutoSchema(ViewInspector): | ||||||
|         Default implementation looks for ModelViewSet or GenericAPIView |         Default implementation looks for ModelViewSet or GenericAPIView | ||||||
|         actions/methods that cause filtering on the default implementation. |         actions/methods that cause filtering on the default implementation. | ||||||
| 
 | 
 | ||||||
|         Override to adjust behaviour for your view. |         Override to adjust behavior for your view. | ||||||
| 
 | 
 | ||||||
|         Note: Introduced in v3.7: Initially "private" (i.e. with leading underscore) |         Note: Introduced in v3.7: Initially "private" (i.e. with leading underscore) | ||||||
|             to allow changes based on user experience. |             to allow changes based on user experience. | ||||||
|  |  | ||||||
|  | @ -86,7 +86,7 @@ class SchemaGenerator(BaseSchemaGenerator): | ||||||
| 
 | 
 | ||||||
|             components_schemas.update(components) |             components_schemas.update(components) | ||||||
| 
 | 
 | ||||||
|             # Normalise path for any provided mount url. |             # Normalize path for any provided mount url. | ||||||
|             if path.startswith('/'): |             if path.startswith('/'): | ||||||
|                 path = path[1:] |                 path = path[1:] | ||||||
|             path = urljoin(self.url or '/', path) |             path = urljoin(self.url or '/', path) | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ Serialization in REST framework is a two-phase process: | ||||||
| 
 | 
 | ||||||
| 1. Serializers marshal between complex types like model instances, and | 1. Serializers marshal between complex types like model instances, and | ||||||
| python primitives. | python primitives. | ||||||
| 2. The process of marshalling between python primitives and request and | 2. The process of marshaling between python primitives and request and | ||||||
| response content is handled by parsers and renderers. | response content is handled by parsers and renderers. | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -33,7 +33,7 @@ class AnonymousUserTests(TestCase): | ||||||
| 
 | 
 | ||||||
| @override_settings(ROOT_URLCONF='tests.browsable_api.auth_urls') | @override_settings(ROOT_URLCONF='tests.browsable_api.auth_urls') | ||||||
| class DropdownWithAuthTests(TestCase): | class DropdownWithAuthTests(TestCase): | ||||||
|     """Tests correct dropdown behaviour with Auth views enabled.""" |     """Tests correct dropdown behavior with Auth views enabled.""" | ||||||
|     def setUp(self): |     def setUp(self): | ||||||
|         self.client = APIClient(enforce_csrf_checks=True) |         self.client = APIClient(enforce_csrf_checks=True) | ||||||
|         self.username = 'john' |         self.username = 'john' | ||||||
|  | @ -74,7 +74,7 @@ class DropdownWithAuthTests(TestCase): | ||||||
| 
 | 
 | ||||||
| @override_settings(ROOT_URLCONF='tests.browsable_api.no_auth_urls') | @override_settings(ROOT_URLCONF='tests.browsable_api.no_auth_urls') | ||||||
| class NoDropdownWithoutAuthTests(TestCase): | class NoDropdownWithoutAuthTests(TestCase): | ||||||
|     """Tests correct dropdown behaviour with Auth views NOT enabled.""" |     """Tests correct dropdown behavior with Auth views NOT enabled.""" | ||||||
|     def setUp(self): |     def setUp(self): | ||||||
|         self.client = APIClient(enforce_csrf_checks=True) |         self.client = APIClient(enforce_csrf_checks=True) | ||||||
|         self.username = 'john' |         self.username = 'john' | ||||||
|  |  | ||||||
|  | @ -28,7 +28,7 @@ urlpatterns = [ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class DropdownWithAuthTests(TestCase): | class DropdownWithAuthTests(TestCase): | ||||||
|     """Tests correct dropdown behaviour with Auth views enabled.""" |     """Tests correct dropdown behavior with Auth views enabled.""" | ||||||
| 
 | 
 | ||||||
|     @override_settings(ROOT_URLCONF='tests.browsable_api.test_browsable_nested_api') |     @override_settings(ROOT_URLCONF='tests.browsable_api.test_browsable_nested_api') | ||||||
|     def test_login(self): |     def test_login(self): | ||||||
|  |  | ||||||
|  | @ -332,7 +332,7 @@ class TestInitialWithCallable: | ||||||
| 
 | 
 | ||||||
|     def test_initial_should_accept_callable(self): |     def test_initial_should_accept_callable(self): | ||||||
|         """ |         """ | ||||||
|         Follows the default ``Field.initial`` behaviour where they accept a |         Follows the default ``Field.initial`` behavior where they accept a | ||||||
|         callable to produce the initial value""" |         callable to produce the initial value""" | ||||||
|         assert self.serializer.data == { |         assert self.serializer.data == { | ||||||
|             'initial_field': 123, |             'initial_field': 123, | ||||||
|  |  | ||||||
|  | @ -287,7 +287,7 @@ class TestNestedListSerializer: | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class TestNestedListSerializerAllowEmpty: | class TestNestedListSerializerAllowEmpty: | ||||||
|     """Tests the behaviour of allow_empty=False when a ListSerializer is used as a field.""" |     """Tests the behavior of allow_empty=False when a ListSerializer is used as a field.""" | ||||||
| 
 | 
 | ||||||
|     @pytest.mark.parametrize('partial', (False, True)) |     @pytest.mark.parametrize('partial', (False, True)) | ||||||
|     def test_allow_empty_true(self, partial): |     def test_allow_empty_true(self, partial): | ||||||
|  | @ -643,7 +643,7 @@ class TestSerializerPartialUsage: | ||||||
| 
 | 
 | ||||||
| class TestEmptyListSerializer: | class TestEmptyListSerializer: | ||||||
|     """ |     """ | ||||||
|     Tests the behaviour of ListSerializers when there is no data passed to it |     Tests the behavior of ListSerializers when there is no data passed to it | ||||||
|     """ |     """ | ||||||
| 
 | 
 | ||||||
|     def setup_method(self): |     def setup_method(self): | ||||||
|  | @ -672,7 +672,7 @@ class TestEmptyListSerializer: | ||||||
| 
 | 
 | ||||||
| class TestMaxMinLengthListSerializer: | class TestMaxMinLengthListSerializer: | ||||||
|     """ |     """ | ||||||
|     Tests the behaviour of ListSerializers when max_length and min_length are used |     Tests the behavior of ListSerializers when max_length and min_length are used | ||||||
|     """ |     """ | ||||||
| 
 | 
 | ||||||
|     def setup_method(self): |     def setup_method(self): | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user