Skip to content

Commit d92b24a

Browse files
Ryan P Kilbytomchristie
authored andcommitted
Make serializer fields import explicit (#4628)
1 parent 5c54b22 commit d92b24a

File tree

2 files changed

+70
-4
lines changed

2 files changed

+70
-4
lines changed

rest_framework/serializers.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,27 @@
1212
"""
1313
from __future__ import unicode_literals
1414

15+
import copy
16+
import inspect
1517
import traceback
18+
from collections import OrderedDict
1619

20+
from django.core.exceptions import ValidationError as DjangoValidationError
21+
from django.core.exceptions import ImproperlyConfigured
1722
from django.db import models
1823
from django.db.models import DurationField as ModelDurationField
1924
from django.db.models.fields import Field as DjangoModelField
2025
from django.db.models.fields import FieldDoesNotExist
26+
from django.utils import six, timezone
2127
from django.utils.functional import cached_property
2228
from django.utils.translation import ugettext_lazy as _
2329

2430
from rest_framework.compat import JSONField as ModelJSONField
2531
from rest_framework.compat import postgres_fields, set_many, unicode_to_repr
26-
from rest_framework.utils import model_meta
32+
from rest_framework.exceptions import ErrorDetail, ValidationError
33+
from rest_framework.fields import get_error_detail, set_value
34+
from rest_framework.settings import api_settings
35+
from rest_framework.utils import html, model_meta, representation
2736
from rest_framework.utils.field_mapping import (
2837
ClassLookupDict, get_field_kwargs, get_nested_relation_kwargs,
2938
get_relation_kwargs, get_url_kwargs
@@ -42,9 +51,23 @@
4251
#
4352
# This helps keep the separation between model fields, form fields, and
4453
# serializer fields more explicit.
54+
from rest_framework.fields import ( # NOQA # isort:skip
55+
BooleanField, CharField, ChoiceField, DateField, DateTimeField, DecimalField,
56+
DictField, DurationField, EmailField, Field, FileField, FilePathField, FloatField,
57+
HiddenField, IPAddressField, ImageField, IntegerField, JSONField, ListField,
58+
ModelField, MultipleChoiceField, NullBooleanField, ReadOnlyField, RegexField,
59+
SerializerMethodField, SlugField, TimeField, URLField, UUIDField,
60+
)
61+
from rest_framework.relations import ( # NOQA # isort:skip
62+
HyperlinkedIdentityField, HyperlinkedRelatedField, ManyRelatedField,
63+
PrimaryKeyRelatedField, RelatedField, SlugRelatedField, StringRelatedField,
64+
)
4565

46-
from rest_framework.fields import * # NOQA # isort:skip
47-
from rest_framework.relations import * # NOQA # isort:skip
66+
# Non-field imports, but public API
67+
from rest_framework.fields import ( # NOQA # isort:skip
68+
CreateOnlyDefault, CurrentUserDefault, SkipField, empty
69+
)
70+
from rest_framework.relations import Hyperlink, PKOnlyObject # NOQA # isort:skip
4871

4972
# We assume that 'validators' are intended for the child serializer,
5073
# rather than the parent serializer.

tests/test_serializer.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,60 @@
11
# coding: utf-8
22
from __future__ import unicode_literals
33

4+
import inspect
45
import pickle
56
import re
67

78
import pytest
89

9-
from rest_framework import serializers
10+
from rest_framework import fields, relations, serializers
1011
from rest_framework.compat import unicode_repr
12+
from rest_framework.fields import Field
1113

1214
from .utils import MockObject
1315

1416

17+
# Test serializer fields imports.
18+
# -------------------------------
19+
20+
class TestFieldImports:
21+
def is_field(self, name, value):
22+
return (
23+
isinstance(value, type) and
24+
issubclass(value, Field) and
25+
not name.startswith('_')
26+
)
27+
28+
def test_fields(self):
29+
msg = "Expected `fields.%s` to be imported in `serializers`"
30+
field_classes = [
31+
key for key, value
32+
in inspect.getmembers(fields)
33+
if self.is_field(key, value)
34+
]
35+
36+
# sanity check
37+
assert 'Field' in field_classes
38+
assert 'BooleanField' in field_classes
39+
40+
for field in field_classes:
41+
assert hasattr(serializers, field), msg % field
42+
43+
def test_relations(self):
44+
msg = "Expected `relations.%s` to be imported in `serializers`"
45+
field_classes = [
46+
key for key, value
47+
in inspect.getmembers(relations)
48+
if self.is_field(key, value)
49+
]
50+
51+
# sanity check
52+
assert 'RelatedField' in field_classes
53+
54+
for field in field_classes:
55+
assert hasattr(serializers, field), msg % field
56+
57+
1558
# Tests for core functionality.
1659
# -----------------------------
1760

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy