From f04123f4dfbbf862e397b6e8c7a96aa5cd39ac1d Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Fri, 29 Aug 2008 21:24:00 +0000 Subject: Fixed #8279 -- Multiple many-to-many relations to "self" are now possible. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8721 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- tests/regressiontests/m2m_regress/__init__.py | 0 tests/regressiontests/m2m_regress/models.py | 56 +++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 tests/regressiontests/m2m_regress/__init__.py create mode 100644 tests/regressiontests/m2m_regress/models.py (limited to 'tests/regressiontests') diff --git a/tests/regressiontests/m2m_regress/__init__.py b/tests/regressiontests/m2m_regress/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/regressiontests/m2m_regress/models.py b/tests/regressiontests/m2m_regress/models.py new file mode 100644 index 0000000000..e641d3dadb --- /dev/null +++ b/tests/regressiontests/m2m_regress/models.py @@ -0,0 +1,56 @@ +from django.db import models + +# No related name is needed here, since symmetrical relations are not +# explicitly reversible. +class SelfRefer(models.Model): + name = models.CharField(max_length=10) + references = models.ManyToManyField('self') + related = models.ManyToManyField('self') + + def __unicode__(self): + return self.name + +class Tag(models.Model): + name = models.CharField(max_length=10) + + 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): + name = models.CharField(max_length=10) + topics = models.ManyToManyField(Tag) + related = models.ManyToManyField(Tag, related_name="similar") + + def __unicode__(self): + return self.name + +__test__ = {"regressions": """ +# Multiple m2m references to the same model or a different model must be +# distinguished when accessing the relations through an instance attribute. + +>>> s1 = SelfRefer.objects.create(name='s1') +>>> s2 = SelfRefer.objects.create(name='s2') +>>> s3 = SelfRefer.objects.create(name='s3') +>>> s1.references.add(s2) +>>> s1.related.add(s3) + +>>> e1 = Entry.objects.create(name='e1') +>>> t1 = Tag.objects.create(name='t1') +>>> t2 = Tag.objects.create(name='t2') +>>> e1.topics.add(t1) +>>> e1.related.add(t2) + +>>> s1.references.all() +[] +>>> s1.related.all() +[] + +>>> e1.topics.all() +[] +>>> e1.related.all() +[] + +""" +} -- cgit v1.3