mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-27 08:29:59 +03:00
Warn when extra_field_kwargs includes fields explicitly declared (related to #3460)
This commit is contained in:
parent
00cd4ef864
commit
36ab17738f
|
@ -1062,12 +1062,26 @@ class ModelSerializer(Serializer):
|
|||
fields = OrderedDict()
|
||||
|
||||
for field_name in field_names:
|
||||
extra_field_kwargs = extra_kwargs.get(field_name, {})
|
||||
|
||||
# If the field is explicitly declared on the class then use that.
|
||||
if field_name in declared_fields:
|
||||
fields[field_name] = declared_fields[field_name]
|
||||
assert not extra_field_kwargs, (
|
||||
"The field '{field_name}' was declared on serializer "
|
||||
"{serializer_class}, but has also been included in "
|
||||
"extra_fields_kwargs ({extra_field_kwargs}). "
|
||||
"This must be a mistake, because extra_field_kwargs are "
|
||||
"not applied to declared fields. For example, if you want "
|
||||
"the field to be read-only, you must explicitly pass "
|
||||
"read_only=True when declaring, instead of including the "
|
||||
"field in read_only_fields.".format(
|
||||
field_name=field_name,
|
||||
serializer_class=self.__class__.__name__,
|
||||
extra_field_kwargs=extra_field_kwargs
|
||||
)
|
||||
)
|
||||
continue
|
||||
|
||||
extra_field_kwargs = extra_kwargs.get(field_name, {})
|
||||
source = extra_field_kwargs.get('source', '*')
|
||||
if source == '*':
|
||||
source = field_name
|
||||
|
|
|
@ -1333,3 +1333,26 @@ class Issue6751Test(TestCase):
|
|||
serializer.save()
|
||||
|
||||
self.assertEqual(instance.char_field, 'value changed by signal')
|
||||
|
||||
class ExtraKwargsForDeclaredFieldsModel(models.Model):
|
||||
test_field = models.CharField(max_length=64)
|
||||
|
||||
class TestExtraKwargsForDeclaredFields(TestCase):
|
||||
"""
|
||||
Passing extra_kwargs for a declared field should throw an AssertionError.
|
||||
Particularly relevant for read_only_fields. See
|
||||
https://github.com/encode/django-rest-framework/issues/3460.
|
||||
"""
|
||||
def test_extra_kwargs_for_declared_fields(self):
|
||||
class TestSerializer(serializers.ModelSerializer):
|
||||
test_field = serializers.CharField()
|
||||
|
||||
class Meta:
|
||||
model = ExtraKwargsForDeclaredFieldsModel
|
||||
fields = ('test_field', )
|
||||
read_only_fields = ('test_field', )
|
||||
|
||||
with pytest.raises(AssertionError) as e_info:
|
||||
TestSerializer(data={'test_field': 'abc'}).fields
|
||||
|
||||
assert 'extra_field_kwargs' in str(e_info.value)
|
||||
|
|
Loading…
Reference in New Issue
Block a user