Skip to content

Commit 1396f68

Browse files
authored
Respect model error_messages for relation (#7599)
1 parent 563a20a commit 1396f68

File tree

2 files changed

+27
-8
lines changed

2 files changed

+27
-8
lines changed

rest_framework/utils/field_mapping.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -217,15 +217,9 @@ def get_field_kwargs(field_name, model_field):
217217
]
218218

219219
if getattr(model_field, 'unique', False):
220-
unique_error_message = model_field.error_messages.get('unique', None)
221-
if unique_error_message:
222-
unique_error_message = unique_error_message % {
223-
'model_name': model_field.model._meta.verbose_name,
224-
'field_label': model_field.verbose_name
225-
}
226220
validator = UniqueValidator(
227221
queryset=model_field.model._default_manager,
228-
message=unique_error_message)
222+
message=get_unique_error_message(model_field))
229223
validator_kwarg.append(validator)
230224

231225
if validator_kwarg:
@@ -281,7 +275,9 @@ def get_relation_kwargs(field_name, relation_info):
281275
if model_field.validators:
282276
kwargs['validators'] = model_field.validators
283277
if getattr(model_field, 'unique', False):
284-
validator = UniqueValidator(queryset=model_field.model._default_manager)
278+
validator = UniqueValidator(
279+
queryset=model_field.model._default_manager,
280+
message=get_unique_error_message(model_field))
285281
kwargs['validators'] = kwargs.get('validators', []) + [validator]
286282
if to_many and not model_field.blank:
287283
kwargs['allow_empty'] = False
@@ -300,3 +296,13 @@ def get_url_kwargs(model_field):
300296
return {
301297
'view_name': get_detail_view_name(model_field)
302298
}
299+
300+
301+
def get_unique_error_message(model_field):
302+
unique_error_message = model_field.error_messages.get('unique', None)
303+
if unique_error_message:
304+
unique_error_message = unique_error_message % {
305+
'model_name': model_field.model._meta.verbose_name,
306+
'field_label': model_field.verbose_name
307+
}
308+
return unique_error_message

tests/test_validators.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ class Meta:
4242
fields = ('username', 'email')
4343

4444

45+
class RelatedModelUserSerializer(serializers.ModelSerializer):
46+
class Meta:
47+
model = RelatedModel
48+
fields = ('user',)
49+
50+
4551
class AnotherUniquenessModel(models.Model):
4652
code = models.IntegerField(unique=True)
4753

@@ -83,6 +89,13 @@ def test_is_not_unique(self):
8389
assert not serializer.is_valid()
8490
assert serializer.errors == {'username': ['uniqueness model with this username already exists.']}
8591

92+
def test_relation_is_not_unique(self):
93+
RelatedModel.objects.create(user=self.instance)
94+
data = {'user': self.instance.pk}
95+
serializer = RelatedModelUserSerializer(data=data)
96+
assert not serializer.is_valid()
97+
assert serializer.errors == {'user': ['related model with this user already exists.']}
98+
8699
def test_is_unique(self):
87100
data = {'username': 'other'}
88101
serializer = UniquenessSerializer(data=data)

0 commit comments

Comments
 (0)