Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
7 changes: 6 additions & 1 deletion rest_framework/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,12 @@ def __call__(self, attrs, serializer):
]

condition_sources = (serializer.fields[field_name].source for field_name in self.condition_fields)
condition_kwargs = {source: attrs[source] for source in condition_sources}
condition_kwargs = {
source: attrs[source]
if source in attrs
else getattr(serializer.instance, source)
for source in condition_sources
}
if checked_values and None not in checked_values and qs_exists_with_condition(queryset, self.condition, condition_kwargs):
field_names = ', '.join(self.fields)
message = self.message.format(field_names=field_names)
Expand Down
32 changes: 32 additions & 0 deletions tests/test_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,21 @@ class Meta:
]


class UniqueConstraintReadOnlyFieldModel(models.Model):
state = models.CharField(max_length=100, default="new")
position = models.IntegerField()
something = models.IntegerField()

class Meta:
constraints = [
models.UniqueConstraint(
name="unique_constraint_%(class)s",
fields=("position", "something"),
condition=models.Q(state="new"),
),
]


class UniqueConstraintNullableModel(models.Model):
title = models.CharField(max_length=100)
age = models.IntegerField(null=True)
Expand Down Expand Up @@ -738,6 +753,23 @@ class Meta:
)
assert serializer.is_valid()

def test_uniq_constraint_condition_read_only(self):
class UniqueConstraintReadOnlyFieldModelSerializer(serializers.ModelSerializer):
class Meta:
model = UniqueConstraintReadOnlyFieldModel
read_only_fields = ("state",)
fields = ("position", "something", *read_only_fields)

serializer = UniqueConstraintReadOnlyFieldModelSerializer(
data={"position": 1, "something": 1}
)
assert serializer.is_valid()
UniqueConstraintReadOnlyFieldModel.objects.create(position=1, something=1)
serializer = UniqueConstraintReadOnlyFieldModelSerializer(
data={"position": 1, "something": 1}
)
assert not serializer.is_valid()


# Tests for `UniqueForDateValidator`
# ----------------------------------
Expand Down