You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .github/ISSUE_TEMPLATE/1-issue.md
+8-1Lines changed: 8 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,6 +5,13 @@ about: Please only raise an issue if you've been advised to do so after discussi
5
5
6
6
## Checklist
7
7
8
+
<!--
9
+
Note: REST framework is considered feature-complete. New functionality should be implemented outside the core REST framework. For details, please check the docs: https://www.django-rest-framework.org/community/third-party-packages/#about-third-party-packages
10
+
-->
11
+
8
12
-[ ] Raised initially as discussion #...
9
-
-[ ] This cannot be dealt with as a third party library. (We prefer new functionality to be [in the form of third party libraries](https://www.django-rest-framework.org/community/third-party-packages/#about-third-party-packages) where possible.)
13
+
-[ ] This is not a feature request suitable for implementation outside this project. Please elaborate what it is:
14
+
-[ ] compatibility fix for new Django/Python version ...
15
+
-[ ] other type of bug fix
16
+
-[ ] other type of improvement that does not touch existing code or change existing behavior (e.g. wrapper for new Django field)
10
17
-[ ] I have reduced the issue to the simplest possible case.
Copy file name to clipboardExpand all lines: README.md
+6-9Lines changed: 6 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -28,8 +28,9 @@ The initial aim is to provide a single full-time position on REST framework.
28
28
[![][cryptapi-img]][cryptapi-url]
29
29
[![][fezto-img]][fezto-url]
30
30
[![][svix-img]][svix-url]
31
+
[![][zuplo-img]][zuplo-url]
31
32
32
-
Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Sentry][sentry-url], [Stream][stream-url], [Spacinov][spacinov-url], [Retool][retool-url], [bit.io][bitio-url], [PostHog][posthog-url], [CryptAPI][cryptapi-url], [FEZTO][fezto-url], and [Svix][svix-url].
33
+
Many thanks to all our [wonderful sponsors][sponsors], and in particular to our premium backers, [Sentry][sentry-url], [Stream][stream-url], [Spacinov][spacinov-url], [Retool][retool-url], [bit.io][bitio-url], [PostHog][posthog-url], [CryptAPI][cryptapi-url], [FEZTO][fezto-url], [Svix][svix-url], and [Zuplo][zuplo-url].
33
34
34
35
---
35
36
@@ -45,8 +46,6 @@ Some reasons you might want to use REST framework:
45
46
* 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].
46
47
*[Extensive documentation][docs], and [great community support][group].
47
48
48
-
There is a live example API for testing purposes, [available here][sandbox].
49
-
50
49
**Below**: *Screenshot from the browsable API*
51
50
52
51
![Screenshot][image]
@@ -55,8 +54,8 @@ There is a live example API for testing purposes, [available here][sandbox].
55
54
56
55
# Requirements
57
56
58
-
* Python 3.6+
59
-
* Django 5.0, 4.2, 4.1, 4.0, 3.2, 3.1, 3.0
57
+
* Python 3.8+
58
+
* Django 4.2, 5.0, 5.1
60
59
61
60
We **highly recommend** and only officially support the latest patch release of
62
61
each Python and Django series.
@@ -174,8 +173,6 @@ Full documentation for the project is available at [https://www.django-rest-fram
174
173
175
174
For questions and support, use the [REST framework discussion group][group], or `#restframework` on libera.chat IRC.
176
175
177
-
You may also want to [follow the author on Twitter][twitter].
178
-
179
176
# Security
180
177
181
178
Please see the [security policy][security-policy].
@@ -186,9 +183,7 @@ Please see the [security policy][security-policy].
Copy file name to clipboardExpand all lines: docs/api-guide/authentication.md
+7Lines changed: 7 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -90,6 +90,12 @@ The kind of response that will be used depends on the authentication scheme. Al
90
90
91
91
Note that when a request may successfully authenticate, but still be denied permission to perform the request, in which case a `403 Permission Denied` response will always be used, regardless of the authentication scheme.
92
92
93
+
## Django 5.1+ `LoginRequiredMiddleware`
94
+
95
+
If you're running Django 5.1+ and use the [`LoginRequiredMiddleware`][login-required-middleware], please note that all views from DRF are opted-out of this middleware. This is because the authentication in DRF is based authentication and permissions classes, which may be determined after the middleware has been applied. Additionally, when the request is not authenticated, the middleware redirects the user to the login page, which is not suitable for API requests, where it's preferable to return a 401 status code.
96
+
97
+
REST framework offers an equivalent mechanism for DRF views via the global settings, `DEFAULT_AUTHENTICATION_CLASSES` and `DEFAULT_PERMISSION_CLASSES`. They should be changed accordingly if you need to enforce that API requests are logged in.
98
+
93
99
## Apache mod_wsgi specific configuration
94
100
95
101
Note that if deploying to [Apache using mod_wsgi][mod_wsgi_official], the authorization header is not passed through to a WSGI application by default, as it is assumed that authentication will be handled by Apache, rather than at an application level.
@@ -484,3 +490,4 @@ More information can be found in the [Documentation](https://django-rest-durin.r
Copy file name to clipboardExpand all lines: docs/api-guide/fields.md
+2-10Lines changed: 2 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -68,14 +68,6 @@ When serializing the instance, default will be used if the object attribute or d
68
68
69
69
Note that setting a `default` value implies that the field is not required. Including both the `default` and `required` keyword arguments is invalid and will raise an error.
70
70
71
-
Notes regarding default value propagation from model to serializer:
72
-
73
-
All the default values from model will pass as default to the serializer and the options method.
74
-
75
-
If the default is callable then it will be propagated to & evaluated every time in the serializer but not in options method.
76
-
77
-
If the value for given field is not given then default value will be present in the serializer and available in serializer's methods. Specified validation on given field will be evaluated on default value as that field will be present in the serializer.
78
-
79
71
### `allow_null`
80
72
81
73
Normally an error will be raised if `None` is passed to a serializer field. Set this keyword argument to `True` if `None` should be considered a valid value.
@@ -299,8 +291,8 @@ Corresponds to `django.db.models.fields.DecimalField`.
299
291
*`max_digits` The maximum number of digits allowed in the number. It must be either `None` or an integer greater than or equal to `decimal_places`.
300
292
*`decimal_places` The number of decimal places to store with the number.
301
293
*`coerce_to_string` Set to `True` if string values should be returned for the representation, or `False` if `Decimal` objects should be returned. Defaults to the same value as the `COERCE_DECIMAL_TO_STRING` settings key, which will be `True` unless overridden. If `Decimal` objects are returned by the serializer, then the final output format will be determined by the renderer. Note that setting `localize` will force the value to `True`.
302
-
*`max_value` Validate that the number provided is no greater than this value.
303
-
*`min_value` Validate that the number provided is no less than this value.
294
+
*`max_value` Validate that the number provided is no greater than this value. Should be an integer or `Decimal` object.
295
+
*`min_value` Validate that the number provided is no less than this value. Should be an integer or `Decimal` object.
304
296
*`localize` Set to `True` to enable localization of input and output based on the current locale. This will also force `coerce_to_string` to `True`. Defaults to `False`. Note that data formatting is enabled if you have set `USE_L10N=True` in your settings file.
305
297
*`rounding` Sets the rounding mode used when quantizing to the configured precision. Valid values are [`decimal` module rounding modes][python-decimal-rounding-modes]. Defaults to `None`.
306
298
*`normalize_output` Will normalize the decimal value when serialized. This will strip all trailing zeroes and change the value's precision to the minimum required precision to be able to represent the value without losing data. Defaults to `False`.
Copy file name to clipboardExpand all lines: docs/api-guide/permissions.md
+1-2Lines changed: 1 addition & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -173,12 +173,11 @@ This permission is suitable if you want to your API to allow read permissions to
173
173
174
174
This permission class ties into Django's standard `django.contrib.auth`[model permissions][contribauth]. This permission must only be applied to views that have a `.queryset` property or `get_queryset()` method. Authorization will only be granted if the user *is authenticated* and has the *relevant model permissions* assigned. The appropriate model is determined by checking `get_queryset().model` or `queryset.model`.
175
175
176
-
*`GET` requests require the user to have the `view` or `change` permission on the model
177
176
*`POST` requests require the user to have the `add` permission on the model.
178
177
*`PUT` and `PATCH` requests require the user to have the `change` permission on the model.
179
178
*`DELETE` requests require the user to have the `delete` permission on the model.
180
179
181
-
The default behaviour can also be overridden to support custom model permissions.
180
+
The default behavior can also be overridden to support custom model permissions. For example, you might want to include a `view` model permission for `GET` requests.
182
181
183
182
To use custom model permissions, override `DjangoModelPermissions` and set the `.perms_map` property. Refer to the source code for details.
Copy file name to clipboardExpand all lines: docs/api-guide/routers.md
+19-19Lines changed: 19 additions & 19 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -142,6 +142,24 @@ The above example would now generate the following URL pattern:
142
142
* URL path: `^users/{pk}/change-password/$`
143
143
* URL name: `'user-change_password'`
144
144
145
+
### Using Django `path()` with routers
146
+
147
+
By default, the URLs created by routers use regular expressions. This behavior can be modified by setting the `use_regex_path` argument to `False` when instantiating the router, in this case [path converters][path-converters-topic-reference] are used. For example:
148
+
149
+
router = SimpleRouter(use_regex_path=False)
150
+
151
+
The router will match lookup values containing any characters except slashes and period characters. For a more restrictive (or lenient) lookup pattern, set the `lookup_value_regex` attribute on the viewset or `lookup_value_converter` if using path converters. For example, you can limit the lookup to valid UUIDs:
152
+
153
+
class MyModelViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
154
+
lookup_field = 'my_model_id'
155
+
lookup_value_regex = '[0-9a-f]{32}'
156
+
157
+
class MyPathModelViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
158
+
lookup_field = 'my_model_uuid'
159
+
lookup_value_converter = 'uuid'
160
+
161
+
Note that path converters will be used on all URLs registered in the router, including viewset actions.
162
+
145
163
# API Guide
146
164
147
165
## SimpleRouter
@@ -160,30 +178,13 @@ This router includes routes for the standard set of `list`, `create`, `retrieve`
160
178
<tr><td>{prefix}/{lookup}/{url_path}/</td><td>GET, or as specified by `methods` argument</td><td>`@action(detail=True)` decorated method</td><td>{basename}-{url_name}</td></tr>
161
179
</table>
162
180
163
-
By default the URLs created by `SimpleRouter` are appended with a trailing slash.
181
+
By default, the URLs created by `SimpleRouter` are appended with a trailing slash.
164
182
This behavior can be modified by setting the `trailing_slash` argument to `False` when instantiating the router. For example:
165
183
166
184
router = SimpleRouter(trailing_slash=False)
167
185
168
186
Trailing slashes are conventional in Django, but are not used by default in some other frameworks such as Rails. Which style you choose to use is largely a matter of preference, although some javascript frameworks may expect a particular routing style.
169
187
170
-
By default the URLs created by `SimpleRouter` use regular expressions. This behavior can be modified by setting the `use_regex_path` argument to `False` when instantiating the router, in this case [path converters][path-converters-topic-reference] are used. For example:
171
-
172
-
router = SimpleRouter(use_regex_path=False)
173
-
174
-
**Note**: `use_regex_path=False` only works with Django 2.x or above, since this feature was introduced in 2.0.0. See [release note][simplified-routing-release-note]
175
-
176
-
177
-
The router will match lookup values containing any characters except slashes and period characters. For a more restrictive (or lenient) lookup pattern, set the `lookup_value_regex` attribute on the viewset or `lookup_value_converter` if using path converters. For example, you can limit the lookup to valid UUIDs:
178
-
179
-
class MyModelViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
180
-
lookup_field = 'my_model_id'
181
-
lookup_value_regex = '[0-9a-f]{32}'
182
-
183
-
class MyPathModelViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
184
-
lookup_field = 'my_model_uuid'
185
-
lookup_value_converter = 'uuid'
186
-
187
188
## DefaultRouter
188
189
189
190
This router is similar to `SimpleRouter` as above, but additionally includes a default API root view, that returns a response containing hyperlinks to all the list views. It also generates routes for optional `.json` style format suffixes.
@@ -351,5 +352,4 @@ The [`DRF-extensions` package][drf-extensions] provides [routers][drf-extensions
0 commit comments