Commit 6bfed6f8 by Tom Christie

Enforce uniqueness validation for relational fields

parent 3a3e2bf5
...@@ -224,6 +224,8 @@ class Field(object): ...@@ -224,6 +224,8 @@ class Field(object):
""" """
if self.default is empty: if self.default is empty:
raise SkipField() raise SkipField()
if is_simple_callable(self.default):
return self.default()
return self.default return self.default
def run_validation(self, data=empty): def run_validation(self, data=empty):
......
...@@ -219,6 +219,9 @@ def get_relation_kwargs(field_name, relation_info): ...@@ -219,6 +219,9 @@ def get_relation_kwargs(field_name, relation_info):
kwargs['required'] = False kwargs['required'] = False
if model_field.null: if model_field.null:
kwargs['allow_null'] = True kwargs['allow_null'] = True
if getattr(model_field, 'unique', False):
validator = UniqueValidator(queryset=model_field.model._default_manager)
kwargs['validators'] = [validator]
return kwargs return kwargs
......
...@@ -248,7 +248,7 @@ class TestRelationalFieldMappings(TestCase): ...@@ -248,7 +248,7 @@ class TestRelationalFieldMappings(TestCase):
TestSerializer(): TestSerializer():
id = IntegerField(label='ID', read_only=True) id = IntegerField(label='ID', read_only=True)
foreign_key = PrimaryKeyRelatedField(queryset=ForeignKeyTargetModel.objects.all()) foreign_key = PrimaryKeyRelatedField(queryset=ForeignKeyTargetModel.objects.all())
one_to_one = PrimaryKeyRelatedField(queryset=OneToOneTargetModel.objects.all()) one_to_one = PrimaryKeyRelatedField(queryset=OneToOneTargetModel.objects.all(), validators=[<UniqueValidator(queryset=RelationalModel.objects.all())>])
many_to_many = PrimaryKeyRelatedField(many=True, queryset=ManyToManyTargetModel.objects.all()) many_to_many = PrimaryKeyRelatedField(many=True, queryset=ManyToManyTargetModel.objects.all())
through = PrimaryKeyRelatedField(many=True, read_only=True) through = PrimaryKeyRelatedField(many=True, read_only=True)
""") """)
...@@ -287,7 +287,7 @@ class TestRelationalFieldMappings(TestCase): ...@@ -287,7 +287,7 @@ class TestRelationalFieldMappings(TestCase):
TestSerializer(): TestSerializer():
url = HyperlinkedIdentityField(view_name='relationalmodel-detail') url = HyperlinkedIdentityField(view_name='relationalmodel-detail')
foreign_key = HyperlinkedRelatedField(queryset=ForeignKeyTargetModel.objects.all(), view_name='foreignkeytargetmodel-detail') foreign_key = HyperlinkedRelatedField(queryset=ForeignKeyTargetModel.objects.all(), view_name='foreignkeytargetmodel-detail')
one_to_one = HyperlinkedRelatedField(queryset=OneToOneTargetModel.objects.all(), view_name='onetoonetargetmodel-detail') one_to_one = HyperlinkedRelatedField(queryset=OneToOneTargetModel.objects.all(), validators=[<UniqueValidator(queryset=RelationalModel.objects.all())>], view_name='onetoonetargetmodel-detail')
many_to_many = HyperlinkedRelatedField(many=True, queryset=ManyToManyTargetModel.objects.all(), view_name='manytomanytargetmodel-detail') many_to_many = HyperlinkedRelatedField(many=True, queryset=ManyToManyTargetModel.objects.all(), view_name='manytomanytargetmodel-detail')
through = HyperlinkedRelatedField(many=True, read_only=True, view_name='throughtargetmodel-detail') through = HyperlinkedRelatedField(many=True, read_only=True, view_name='throughtargetmodel-detail')
""") """)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment