diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 1f7d964a5..9280ea3a3 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -160,6 +160,17 @@ class Field(object): """ Setup the context for the field instance. """ + + # In order to enforce a consistent style, we error if a redundant + # 'source' argument has been used. For example: + # my_field = serializer.CharField(source='my_field') + assert self._kwargs.get('source') != field_name, ( + "It is redundant to specify `source='%s'` on field '%s' in " + "serializer '%s', as it is the same the field name. " + "Remove the `source` keyword argument." % + (field_name, self.__class__.__name__, parent.__class__.__name__) + ) + self.field_name = field_name self.parent = parent self.root = root diff --git a/tests/test_fields.py b/tests/test_fields.py index 91f3f5db7..c2e030239 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -1,6 +1,6 @@ from decimal import Decimal from django.utils import timezone -from rest_framework import fields +from rest_framework import fields, serializers import datetime import django import pytest @@ -69,6 +69,17 @@ class TestFieldOptions: output = field.run_validation() assert output is 123 + def test_redundant_source(self): + class ExampleSerializer(serializers.Serializer): + example_field = serializers.CharField(source='example_field') + with pytest.raises(AssertionError) as exc_info: + ExampleSerializer() + assert str(exc_info.value) == ( + "It is redundant to specify `source='example_field'` on field " + "'CharField' in serializer 'ExampleSerializer', as it is the " + "same the field name. Remove the `source` keyword argument." + ) + # Tests for field input and output values. # ----------------------------------------