Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #11956 -- Modified the handling of m2m relationships between su…

…bclasses. Thanks to nidi for the report, and astoneman for the suggestion on how to fix the problem.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12908 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 5e5203c7d73684ef7d5e4ce1cb71f2b92ae19360 1 parent 8f8743a
@freakboy3742 freakboy3742 authored
View
4 django/db/models/fields/related.py
@@ -710,7 +710,7 @@ def __get__(self, instance, instance_type=None):
model=rel_model,
core_filters={'%s__pk' % self.field.related_query_name(): instance._get_pk_val()},
instance=instance,
- symmetrical=(self.field.rel.symmetrical and isinstance(instance, rel_model)),
+ symmetrical=self.field.rel.symmetrical,
source_field_name=self.field.m2m_field_name(),
target_field_name=self.field.m2m_reverse_field_name(),
reverse=False
@@ -991,7 +991,7 @@ def __init__(self, to, **kwargs):
kwargs['rel'] = ManyToManyRel(to,
related_name=kwargs.pop('related_name', None),
limit_choices_to=kwargs.pop('limit_choices_to', None),
- symmetrical=kwargs.pop('symmetrical', True),
+ symmetrical=kwargs.pop('symmetrical', to==RECURSIVE_RELATIONSHIP_CONSTANT),
through=kwargs.pop('through', None))
self.db_table = kwargs.pop('db_table', None)
View
19 tests/regressiontests/m2m_regress/models.py
@@ -17,6 +17,13 @@ class Tag(models.Model):
def __unicode__(self):
return self.name
+# Regression for #11956 -- a many to many to the base class
+class TagCollection(Tag):
+ tags = models.ManyToManyField(Tag, related_name='tag_collections')
+
+ def __unicode__(self):
+ return self.name
+
# A related_name is required on one of the ManyToManyField entries here because
# they are both addressable as reverse relations from Tag.
class Entry(models.Model):
@@ -102,5 +109,17 @@ class User(models.Model):
>>> w.save()
>>> w.delete()
+# Regression for #11956 -- You can add an object to a m2m with the
+# base class without causing integrity errors
+>>> c1 = TagCollection.objects.create(name='c1')
+>>> c1.tags = [t1,t2]
+
+>>> c1 = TagCollection.objects.get(name='c1')
+>>> c1.tags.all()
+[<Tag: t1>, <Tag: t2>]
+
+>>> t1.tag_collections.all()
+[<TagCollection: c1>]
+
"""
}
Please sign in to comment.
Something went wrong with that request. Please try again.