Skip to content
45 changes: 45 additions & 0 deletions tests/test_model_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -542,6 +542,15 @@ class Meta:
unique_together = ("foreign_key", "one_to_one")


class NullableUniqueTogetherModel(models.Model):
name = models.CharField(max_length=100)
field_1 = models.IntegerField(null=True)
field_2 = models.TextField(null=True)

class Meta:
unique_together = ("field_1", "field_2")


class TestRelationalFieldMappings(TestCase):
def test_pk_relations(self):
class TestSerializer(serializers.ModelSerializer):
Expand Down Expand Up @@ -731,6 +740,17 @@ class Meta:
""")
self.assertEqual(repr(TestSerializer()), expected)

def test_nullable_unique_together(self):
class TestSerializer(serializers.ModelSerializer):
class Meta:
model = NullableUniqueTogetherModel
fields = ('name', 'field_1', 'field_2')

serializer = TestSerializer(data={"name": "Test"})
self.assertTrue(serializer.is_valid(), serializer.errors)
instance = serializer.save()
assert isinstance(instance, NullableUniqueTogetherModel)


class DisplayValueTargetModel(models.Model):
name = models.CharField(max_length=100)
Expand Down Expand Up @@ -1400,3 +1420,28 @@ class Meta:
serializer.save()

self.assertEqual(instance.char_field, 'value changed by signal')


class UniqueConstraintNullableModel(models.Model):
title = models.CharField(max_length=100)
age = models.IntegerField(null=True)
tag = models.CharField(max_length=100, null=True)

class Meta:
constraints = [
# Unique constraint on 2 nullable fields
models.UniqueConstraint(name='unique_constraint', fields=('age', 'tag'))
]


class TestUniqueConstraintWithNullableFields(TestCase):
def test_nullable_unique_constraint_fields_are_not_required(self):
class UniqueConstraintNullableSerializer(serializers.ModelSerializer):
class Meta:
model = UniqueConstraintNullableModel
fields = ('title', 'age', 'tag')

serializer = UniqueConstraintNullableSerializer(data={'title': 'Bob'})
self.assertTrue(serializer.is_valid(), serializer.errors)
result = serializer.save()
self.assertIsInstance(result, UniqueConstraintNullableModel)
8 changes: 8 additions & 0 deletions tests/test_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -441,6 +441,14 @@ def test_ignore_validation_for_null_fields(self):
serializer = NullUniquenessTogetherSerializer(data=data)
assert serializer.is_valid()

def test_ignore_validation_for_missing_nullable_fields(self):
data = {
'date': datetime.date(2000, 1, 1),
'race_name': 'Paris Marathon',
}
serializer = NullUniquenessTogetherSerializer(data=data)
assert serializer.is_valid(), serializer.errors

def test_do_not_ignore_validation_for_null_fields(self):
# None values that are not on fields part of the uniqueness constraint
# do not cause the instance to skip validation.
Expand Down
Loading