mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-03-31 15:24:31 +03:00
Update ModelSerializer fields behavior
This commit is contained in:
parent
8264222497
commit
654e0e4527
|
@ -12,6 +12,8 @@ response content is handled by parsers and renderers.
|
|||
"""
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import warnings
|
||||
|
||||
from django.db import models
|
||||
from django.db.models.fields import Field as DjangoModelField
|
||||
from django.db.models.fields import FieldDoesNotExist
|
||||
|
@ -51,6 +53,8 @@ LIST_SERIALIZER_KWARGS = (
|
|||
'instance', 'data', 'partial', 'context', 'allow_null'
|
||||
)
|
||||
|
||||
ALL_FIELDS = '__all__'
|
||||
|
||||
|
||||
# BaseSerializer
|
||||
# --------------
|
||||
|
@ -943,13 +947,13 @@ class ModelSerializer(Serializer):
|
|||
fields = getattr(self.Meta, 'fields', None)
|
||||
exclude = getattr(self.Meta, 'exclude', None)
|
||||
|
||||
if fields and not isinstance(fields, (list, tuple)):
|
||||
if fields and fields != ALL_FIELDS and not isinstance(fields, (list, tuple)):
|
||||
raise TypeError(
|
||||
'The `fields` option must be a list or tuple. Got %s.' %
|
||||
type(fields).__name__
|
||||
)
|
||||
|
||||
if exclude and not isinstance(exclude, (list, tuple)):
|
||||
if exclude and exclude != ALL_FIELDS and not isinstance(exclude, (list, tuple)):
|
||||
raise TypeError(
|
||||
'The `exclude` option must be a list or tuple. Got %s.' %
|
||||
type(exclude).__name__
|
||||
|
@ -962,6 +966,19 @@ class ModelSerializer(Serializer):
|
|||
)
|
||||
)
|
||||
|
||||
if fields is None and exclude is None:
|
||||
warnings.warn(
|
||||
"Creating a ModelSerializer without either the 'fields' attribute "
|
||||
"or the 'exclude' attribute will be prohibited. "
|
||||
"The {serializer_class} serializer needs updating.".format(
|
||||
serializer_class=self.__class__.__name__
|
||||
),
|
||||
PendingDeprecationWarning
|
||||
)
|
||||
|
||||
if fields == ALL_FIELDS:
|
||||
fields = None
|
||||
|
||||
if fields is not None:
|
||||
# Ensure that all declared fields have also been included in the
|
||||
# `Meta.fields` option.
|
||||
|
|
|
@ -321,6 +321,21 @@ class TestRegularFieldMappings(TestCase):
|
|||
|
||||
ExampleSerializer()
|
||||
|
||||
def test_fields_and_exclude_behavior(self):
|
||||
class ImplicitFieldsSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = RegularFieldsModel
|
||||
|
||||
class ExplicitFieldsSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = RegularFieldsModel
|
||||
fields = '__all__'
|
||||
|
||||
implicit = ImplicitFieldsSerializer()
|
||||
explicit = ExplicitFieldsSerializer()
|
||||
|
||||
assert implicit.data == explicit.data
|
||||
|
||||
|
||||
@pytest.mark.skipif(django.VERSION < (1, 8),
|
||||
reason='DurationField is only available for django1.8+')
|
||||
|
|
Loading…
Reference in New Issue
Block a user