Refactored workhorse methods on m2m descriptors. Modified _add to check for the type of incoming objects (to match existing _remove implementation), and modified _remove to use a single query rather than 1 per object (to match existing _add implementation).
git-svn-id: http://code.djangoproject.com/svn/django/trunk@4233 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
e859f108f1
commit
64a2718f6c
|
@ -319,6 +319,10 @@ def create_many_related_manager(superclass):
|
||||||
|
|
||||||
# If there aren't any objects, there is nothing to do.
|
# If there aren't any objects, there is nothing to do.
|
||||||
if objs:
|
if objs:
|
||||||
|
# Check that all the objects are of the right type
|
||||||
|
for obj in objs:
|
||||||
|
if not isinstance(obj, self.model):
|
||||||
|
raise ValueError, "objects to add() must be %s instances" % self.model._meta.object_name
|
||||||
# Add the newly created or already existing objects to the join table.
|
# Add the newly created or already existing objects to the join table.
|
||||||
# First find out which items are already added, to avoid adding them twice
|
# First find out which items are already added, to avoid adding them twice
|
||||||
new_ids = set([obj._get_pk_val() for obj in objs])
|
new_ids = set([obj._get_pk_val() for obj in objs])
|
||||||
|
@ -345,16 +349,20 @@ def create_many_related_manager(superclass):
|
||||||
# *objs - objects to remove
|
# *objs - objects to remove
|
||||||
from django.db import connection
|
from django.db import connection
|
||||||
|
|
||||||
for obj in objs:
|
# If there aren't any objects, there is nothing to do.
|
||||||
if not isinstance(obj, self.model):
|
if objs:
|
||||||
raise ValueError, "objects to remove() must be %s instances" % self.model._meta.object_name
|
# Check that all the objects are of the right type
|
||||||
# Remove the specified objects from the join table
|
for obj in objs:
|
||||||
cursor = connection.cursor()
|
if not isinstance(obj, self.model):
|
||||||
for obj in objs:
|
raise ValueError, "objects to remove() must be %s instances" % self.model._meta.object_name
|
||||||
cursor.execute("DELETE FROM %s WHERE %s = %%s AND %s = %%s" % \
|
# Remove the specified objects from the join table
|
||||||
(self.join_table, source_col_name, target_col_name),
|
old_ids = set([obj._get_pk_val() for obj in objs])
|
||||||
[self._pk_val, obj._get_pk_val()])
|
cursor = connection.cursor()
|
||||||
transaction.commit_unless_managed()
|
cursor.execute("DELETE FROM %s WHERE %s = %%s AND %s IN (%s)" % \
|
||||||
|
(self.join_table, source_col_name,
|
||||||
|
target_col_name, ",".join(['%s'] * len(old_ids))),
|
||||||
|
[self._pk_val] + list(old_ids))
|
||||||
|
transaction.commit_unless_managed()
|
||||||
|
|
||||||
def _clear_items(self, source_col_name):
|
def _clear_items(self, source_col_name):
|
||||||
# source_col_name: the PK colname in join_table for the source object
|
# source_col_name: the PK colname in join_table for the source object
|
||||||
|
|
Loading…
Reference in New Issue