Commit 3d85473e by Aider Ibragimov

Fix UniqueTogetherValidator for NULL values

parent 7b639c0c
...@@ -138,7 +138,9 @@ class UniqueTogetherValidator: ...@@ -138,7 +138,9 @@ class UniqueTogetherValidator:
queryset = self.queryset queryset = self.queryset
queryset = self.filter_queryset(attrs, queryset) queryset = self.filter_queryset(attrs, queryset)
queryset = self.exclude_current_instance(attrs, queryset) queryset = self.exclude_current_instance(attrs, queryset)
if queryset.exists():
# Ignore validation if any field is None
if None not in attrs.values() and queryset.exists():
field_names = ', '.join(self.fields) field_names = ', '.join(self.fields)
raise ValidationError(self.message.format(field_names=field_names)) raise ValidationError(self.message.format(field_names=field_names))
......
...@@ -76,8 +76,8 @@ class TestUniquenessValidation(TestCase): ...@@ -76,8 +76,8 @@ class TestUniquenessValidation(TestCase):
# ----------------------------------- # -----------------------------------
class UniquenessTogetherModel(models.Model): class UniquenessTogetherModel(models.Model):
race_name = models.CharField(max_length=100) race_name = models.CharField(max_length=100, null=True)
position = models.IntegerField() position = models.IntegerField(null=True)
class Meta: class Meta:
unique_together = ('race_name', 'position') unique_together = ('race_name', 'position')
...@@ -108,8 +108,8 @@ class TestUniquenessTogetherValidation(TestCase): ...@@ -108,8 +108,8 @@ class TestUniquenessTogetherValidation(TestCase):
expected = dedent(""" expected = dedent("""
UniquenessTogetherSerializer(): UniquenessTogetherSerializer():
id = IntegerField(label='ID', read_only=True) id = IntegerField(label='ID', read_only=True)
race_name = CharField(max_length=100, required=True) race_name = CharField(allow_null=True, max_length=100, required=True)
position = IntegerField(required=True) position = IntegerField(allow_null=True, required=True)
class Meta: class Meta:
validators = [<UniqueTogetherValidator(queryset=UniquenessTogetherModel.objects.all(), fields=('race_name', 'position'))>] validators = [<UniqueTogetherValidator(queryset=UniquenessTogetherModel.objects.all(), fields=('race_name', 'position'))>]
""") """)
...@@ -178,10 +178,20 @@ class TestUniquenessTogetherValidation(TestCase): ...@@ -178,10 +178,20 @@ class TestUniquenessTogetherValidation(TestCase):
expected = dedent(""" expected = dedent("""
ExcludedFieldSerializer(): ExcludedFieldSerializer():
id = IntegerField(label='ID', read_only=True) id = IntegerField(label='ID', read_only=True)
race_name = CharField(max_length=100) race_name = CharField(allow_null=True, max_length=100, required=False)
""") """)
assert repr(serializer) == expected assert repr(serializer) == expected
def test_ignore_validation_for_null_fields(self):
UniquenessTogetherModel.objects.create(
race_name=None,
position=None
)
data = {'race_name': None, 'position': None}
serializer = UniquenessTogetherSerializer(data=data)
assert serializer.is_valid()
# Tests for `UniqueForDateValidator` # Tests for `UniqueForDateValidator`
# ---------------------------------- # ----------------------------------
......
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