Commit 9c5e2728 authored by Tim Graham's avatar Tim Graham
Browse files

Fixed #25550 -- Deprecated direct assignment to the reverse side of a related set.

parent 0b5d32fa
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -201,7 +201,7 @@ class DeserializedObject(object):
        models.Model.save_base(self.object, using=using, raw=True, **kwargs)
        if self.m2m_data and save_m2m:
            for accessor_name, object_list in self.m2m_data.items():
                setattr(self.object, accessor_name, object_list)
                getattr(self.object, accessor_name).set(object_list)

        # prevent a second (possibly accidental) call to save() from saving
        # the m2m data twice.
+1 −1
Original line number Diff line number Diff line
@@ -1600,7 +1600,7 @@ class ManyToManyField(RelatedField):
        return getattr(obj, self.attname).all()

    def save_form_data(self, instance, data):
        setattr(instance, self.attname, data)
        getattr(instance, self.attname).set(data)

    def formfield(self, **kwargs):
        db = kwargs.pop('using', None)
+7 −0
Original line number Diff line number Diff line
@@ -62,11 +62,13 @@ and two directions (forward and reverse) for a total of six combinations.

from __future__ import unicode_literals

import warnings
from operator import attrgetter

from django.db import connections, router, transaction
from django.db.models import Q, signals
from django.db.models.query import QuerySet
from django.utils.deprecation import RemovedInDjango20Warning
from django.utils.functional import cached_property


@@ -477,6 +479,11 @@ class ReverseManyToOneDescriptor(object):
        - ``instance`` is the ``parent`` instance
        - ``value`` in the ``children`` sequence on the right of the equal sign
        """
        warnings.warn(
            'Direct assignment to the reverse side of a related set is '
            'deprecated due to the implicit save() that happens. Use %s.set() '
            'instead.' % self.rel.get_accessor_name(), RemovedInDjango20Warning, stacklevel=2,
        )
        manager = self.__get__(instance)
        manager.set(value)

+3 −0
Original line number Diff line number Diff line
@@ -109,6 +109,9 @@ details on these changes.

* The ``makemigrations --exit`` option will be removed.

* Support for direct assignment to a reverse foreign key or many-to-many
  relation will be removed.

.. _deprecation-removed-in-1.10:

1.10
+1 −1
Original line number Diff line number Diff line
@@ -337,7 +337,7 @@ Fields

        Many-to-many field to :class:`~django.contrib.auth.models.Permission`::

            group.permissions = [permission_list]
            group.permissions.set([permission_list])
            group.permissions.add(permission, permission, ...)
            group.permissions.remove(permission, permission, ...)
            group.permissions.clear()
Loading