Permalink
Browse files

[1.1.X] Fixed #11956 -- Modified the handling of m2m relationships be…

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

Backport of r12908 from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@12909 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
1 parent adfeb96 commit ac0aea8910ec72a874ccd859a4f6449a895f4ec0 @freakboy3742 freakboy3742 committed Apr 2, 2010
Showing with 21 additions and 2 deletions.
  1. +2 −2 django/db/models/fields/related.py
  2. +19 −0 tests/regressiontests/m2m_regress/models.py
@@ -606,7 +606,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,
join_table=qn(self.field.m2m_db_table()),
source_col_name=qn(self.field.m2m_column_name()),
target_col_name=qn(self.field.m2m_reverse_name())
@@ -804,7 +804,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)
@@ -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>]
+
"""
}

0 comments on commit ac0aea8

Please sign in to comment.