1
0
mirror of https://github.com/django/django.git synced 2025-10-26 07:06:08 +00:00

Refs #25550 -- Removed support for direct assignment to the reverse side of a related set.

This commit is contained in:
Tim Graham
2016-12-31 09:04:09 -05:00
parent e0910dcc92
commit ed251246cc
5 changed files with 17 additions and 74 deletions

View File

@@ -510,28 +510,16 @@ class ReverseManyToOneDescriptor(object):
return self.related_manager_cls(instance)
def _get_set_deprecation_msg_params(self):
return ( # RemovedInDjango20Warning
return (
'reverse side of a related set',
self.rel.get_accessor_name(),
)
def __set__(self, instance, value):
"""
Set the related objects through the reverse relation.
With the example above, when setting ``parent.children = children``:
- ``self`` is the descriptor managing the ``children`` attribute
- ``instance`` is the ``parent`` instance
- ``value`` is the ``children`` sequence on the right of the equal sign
"""
warnings.warn(
'Direct assignment to the %s is deprecated due to the implicit '
'save() that happens. Use %s.set() instead.' % self._get_set_deprecation_msg_params(),
RemovedInDjango20Warning, stacklevel=2,
raise TypeError(
'Direct assignment to the %s is prohibited. Use %s.set() instead.'
% self._get_set_deprecation_msg_params(),
)
manager = self.__get__(instance)
manager.set(value)
def create_reverse_many_to_one_manager(superclass, rel):
@@ -772,7 +760,7 @@ class ManyToManyDescriptor(ReverseManyToOneDescriptor):
)
def _get_set_deprecation_msg_params(self):
return ( # RemovedInDjango20Warning
return (
'%s side of a many-to-many set' % ('reverse' if self.reverse else 'forward'),
self.rel.get_accessor_name() if self.reverse else self.field.name,
)