Skip to content

Commit 7623243

Browse files
authored
Allow type checkers to make serializers generic (#7385)
1 parent d46d5cb commit 7623243

File tree

3 files changed

+21
-0
lines changed

3 files changed

+21
-0
lines changed

rest_framework/serializers.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@ def __new__(cls, *args, **kwargs):
121121
return cls.many_init(*args, **kwargs)
122122
return super().__new__(cls, *args, **kwargs)
123123

124+
# Allow type checkers to make serializers generic.
125+
def __class_getitem__(cls, *args, **kwargs):
126+
return cls
127+
124128
@classmethod
125129
def many_init(cls, *args, **kwargs):
126130
"""

tests/test_serializer.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import inspect
22
import pickle
33
import re
4+
import sys
45
from collections import ChainMap
56
from collections.abc import Mapping
67

@@ -204,6 +205,13 @@ class ExampleSerializer(serializers.Serializer):
204205
exceptions.ErrorDetail(string='Raised error', code='invalid')
205206
]}
206207

208+
@pytest.mark.skipif(
209+
sys.version_info < (3, 7),
210+
reason="subscriptable classes requires Python 3.7 or higher",
211+
)
212+
def test_serializer_is_subscriptable(self):
213+
assert serializers.Serializer is serializers.Serializer["foo"]
214+
207215

208216
class TestValidateMethod:
209217
def test_non_field_error_validate_method(self):

tests/test_serializer_lists.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import sys
2+
13
import pytest
24
from django.http import QueryDict
35
from django.utils.datastructures import MultiValueDict
@@ -55,6 +57,13 @@ def test_validate_html_input(self):
5557
assert serializer.is_valid()
5658
assert serializer.validated_data == expected_output
5759

60+
@pytest.mark.skipif(
61+
sys.version_info < (3, 7),
62+
reason="subscriptable classes requires Python 3.7 or higher",
63+
)
64+
def test_list_serializer_is_subscriptable(self):
65+
assert serializers.ListSerializer is serializers.ListSerializer["foo"]
66+
5867

5968
class TestListSerializerContainingNestedSerializer:
6069
"""

0 commit comments

Comments
 (0)