Fixed #10413: RelatedManager.add no longer fails silenty when trying to add an object of the wrong type. Thanks, dgouldin.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@10226 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
c8ad87c2dc
commit
6ce25d3be9
|
@ -253,6 +253,8 @@ def create_generic_related_manager(superclass):
|
||||||
|
|
||||||
def add(self, *objs):
|
def add(self, *objs):
|
||||||
for obj in objs:
|
for obj in objs:
|
||||||
|
if not isinstance(obj, self.model):
|
||||||
|
raise TypeError, "'%s' instance expected" % self.model._meta.object_name
|
||||||
setattr(obj, self.content_type_field_name, self.content_type)
|
setattr(obj, self.content_type_field_name, self.content_type)
|
||||||
setattr(obj, self.object_id_field_name, self.pk_val)
|
setattr(obj, self.object_id_field_name, self.pk_val)
|
||||||
obj.save()
|
obj.save()
|
||||||
|
|
|
@ -332,6 +332,8 @@ class ForeignRelatedObjectsDescriptor(object):
|
||||||
|
|
||||||
def add(self, *objs):
|
def add(self, *objs):
|
||||||
for obj in objs:
|
for obj in objs:
|
||||||
|
if not isinstance(obj, self.model):
|
||||||
|
raise TypeError, "'%s' instance expected" % self.model._meta.object_name
|
||||||
setattr(obj, rel_field.name, instance)
|
setattr(obj, rel_field.name, instance)
|
||||||
obj.save()
|
obj.save()
|
||||||
add.alters_data = True
|
add.alters_data = True
|
||||||
|
@ -452,11 +454,14 @@ def create_many_related_manager(superclass, through=False):
|
||||||
|
|
||||||
# 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:
|
||||||
|
from django.db.models.base import Model
|
||||||
# Check that all the objects are of the right type
|
# Check that all the objects are of the right type
|
||||||
new_ids = set()
|
new_ids = set()
|
||||||
for obj in objs:
|
for obj in objs:
|
||||||
if isinstance(obj, self.model):
|
if isinstance(obj, self.model):
|
||||||
new_ids.add(obj._get_pk_val())
|
new_ids.add(obj._get_pk_val())
|
||||||
|
elif isinstance(obj, Model):
|
||||||
|
raise TypeError, "'%s' instance expected" % self.model._meta.object_name
|
||||||
else:
|
else:
|
||||||
new_ids.add(obj)
|
new_ids.add(obj)
|
||||||
# Add the newly created or already existing objects to the join table.
|
# Add the newly created or already existing objects to the join table.
|
||||||
|
|
|
@ -61,6 +61,12 @@ ValueError: 'Article' instance needs to have a primary key value before a many-t
|
||||||
# Adding a second time is OK
|
# Adding a second time is OK
|
||||||
>>> a2.publications.add(p3)
|
>>> a2.publications.add(p3)
|
||||||
|
|
||||||
|
# Adding an object of the wrong type raises TypeError
|
||||||
|
>>> a2.publications.add(a1)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
TypeError: 'Publication' instance expected
|
||||||
|
|
||||||
# Add a Publication directly via publications.add by using keyword arguments.
|
# Add a Publication directly via publications.add by using keyword arguments.
|
||||||
>>> new_publication = a2.publications.create(title='Highlights for Children')
|
>>> new_publication = a2.publications.create(title='Highlights for Children')
|
||||||
|
|
||||||
|
|
|
@ -72,6 +72,13 @@ __test__ = {'API_TESTS':"""
|
||||||
>>> r2.article_set.add(new_article2)
|
>>> r2.article_set.add(new_article2)
|
||||||
>>> new_article2.reporter.id
|
>>> new_article2.reporter.id
|
||||||
2
|
2
|
||||||
|
|
||||||
|
# Adding an object of the wrong type raises TypeError
|
||||||
|
>>> r.article_set.add(r2)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
TypeError: 'Article' instance expected
|
||||||
|
|
||||||
>>> r.article_set.all()
|
>>> r.article_set.all()
|
||||||
[<Article: John's second story>, <Article: This is a test>]
|
[<Article: John's second story>, <Article: This is a test>]
|
||||||
>>> r2.article_set.all()
|
>>> r2.article_set.all()
|
||||||
|
|
Loading…
Reference in New Issue