mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-02 19:40:13 +03:00
Merge a1322ca441
into 4d57d46bf8
This commit is contained in:
commit
e24d5c3faf
|
@ -263,6 +263,7 @@ class CreateOnlyDefault(object):
|
||||||
def set_context(self, serializer_field):
|
def set_context(self, serializer_field):
|
||||||
self.is_update = serializer_field.parent.instance is not None
|
self.is_update = serializer_field.parent.instance is not None
|
||||||
if callable(self.default) and hasattr(self.default, 'set_context') and not self.is_update:
|
if callable(self.default) and hasattr(self.default, 'set_context') and not self.is_update:
|
||||||
|
self.default = copy.deepcopy(self.default)
|
||||||
self.default.set_context(serializer_field)
|
self.default.set_context(serializer_field)
|
||||||
|
|
||||||
def __call__(self):
|
def __call__(self):
|
||||||
|
@ -487,6 +488,7 @@ class Field(object):
|
||||||
raise SkipField()
|
raise SkipField()
|
||||||
if callable(self.default):
|
if callable(self.default):
|
||||||
if hasattr(self.default, 'set_context'):
|
if hasattr(self.default, 'set_context'):
|
||||||
|
self.default = copy.deepcopy(self.default)
|
||||||
self.default.set_context(self)
|
self.default.set_context(self)
|
||||||
return self.default()
|
return self.default()
|
||||||
return self.default
|
return self.default
|
||||||
|
@ -544,6 +546,7 @@ class Field(object):
|
||||||
errors = []
|
errors = []
|
||||||
for validator in self.validators:
|
for validator in self.validators:
|
||||||
if hasattr(validator, 'set_context'):
|
if hasattr(validator, 'set_context'):
|
||||||
|
validator = copy.deepcopy(validator)
|
||||||
validator.set_context(self)
|
validator.set_context(self)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -365,6 +365,28 @@ class TestUniquenessTogetherValidation(TestCase):
|
||||||
validator.filter_queryset(attrs=data, queryset=queryset)
|
validator.filter_queryset(attrs=data, queryset=queryset)
|
||||||
assert queryset.called_with == {'race_name': 'bar', 'position': 1}
|
assert queryset.called_with == {'race_name': 'bar', 'position': 1}
|
||||||
|
|
||||||
|
def test_validator_instances_with_context_are_not_used_twice(self):
|
||||||
|
"""
|
||||||
|
Every instance of a serializer should use unique instances of validators
|
||||||
|
when calling `set_context`.
|
||||||
|
"""
|
||||||
|
def data():
|
||||||
|
return {'race_name': 'example', 'position': 3}
|
||||||
|
|
||||||
|
def check_validators(serializer):
|
||||||
|
for validator in serializer.validators:
|
||||||
|
assert not hasattr(validator, 'instance')
|
||||||
|
|
||||||
|
serializer = UniquenessTogetherSerializer(self.instance, data=data())
|
||||||
|
check_validators(serializer)
|
||||||
|
serializer.run_validators({})
|
||||||
|
check_validators(serializer)
|
||||||
|
|
||||||
|
another_serializer = UniquenessTogetherSerializer(data=data())
|
||||||
|
check_validators(another_serializer)
|
||||||
|
another_serializer.run_validators(data())
|
||||||
|
check_validators(another_serializer)
|
||||||
|
|
||||||
|
|
||||||
# Tests for `UniqueForDateValidator`
|
# Tests for `UniqueForDateValidator`
|
||||||
# ----------------------------------
|
# ----------------------------------
|
||||||
|
|
Loading…
Reference in New Issue
Block a user