Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion rest_framework/utils/field_mapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,11 @@ def get_field_kwargs(field_name, model_field):
if isinstance(model_field, models.GenericIPAddressField):
validator_kwarg = [
validator for validator in validator_kwarg
if validator is not validators.validate_ipv46_address
if validator not in (
validators.validate_ipv46_address,
Comment on lines 208 to +212
validators.validate_ipv4_address,
validators.validate_ipv6_address,
)
]
# Our decimal validation is handled in the field code, not validator code.
if isinstance(model_field, models.DecimalField):
Expand Down
36 changes: 36 additions & 0 deletions tests/test_model_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,42 @@ class Meta:
'Unexpected number of validation errors: '
'{}'.format(s.errors))

def test_ip_address_validation_with_protocol_ipv4(self):
class IPAddressFieldModel(models.Model):
address = models.GenericIPAddressField(protocol='IPv4')

class Meta:
app_label = 'test_model_serializer'

class TestSerializer(serializers.ModelSerializer):
class Meta:
model = IPAddressFieldModel
fields = '__all__'
Comment on lines +443 to +452

s = TestSerializer(data={'address': 'not an ip address'})
self.assertFalse(s.is_valid())
self.assertEqual(1, len(s.errors['address']),
'Unexpected number of validation errors: '
'{}'.format(s.errors))
Comment on lines +454 to +458

def test_ip_address_validation_with_protocol_ipv6(self):
class IPAddressFieldModel(models.Model):
address = models.GenericIPAddressField(protocol='IPv6')

class Meta:
app_label = 'test_model_serializer'

class TestSerializer(serializers.ModelSerializer):
class Meta:
model = IPAddressFieldModel
fields = '__all__'
Comment on lines +461 to +470

s = TestSerializer(data={'address': 'not an ip address'})
self.assertFalse(s.is_valid())
self.assertEqual(1, len(s.errors['address']),
'Unexpected number of validation errors: '
'{}'.format(s.errors))
Comment on lines +472 to +476


@pytest.mark.skipif('not postgres_fields')
class TestPosgresFieldsMapping(TestCase):
Expand Down
Loading