summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAdrian Holovaty <adrian@holovaty.com>2005-07-29 20:30:10 +0000
committerAdrian Holovaty <adrian@holovaty.com>2005-07-29 20:30:10 +0000
commit33d5006cc7436363a01acbf3e2181ea317794939 (patch)
tree1809b3e7362b5e8caee71c2df84502a138241a1e /tests
parent645111894657f12f0acc8be1f56676a461d81b6d (diff)
Added m2m_intermediary model unit test/example
git-svn-id: http://code.djangoproject.com/svn/django/trunk@344 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests')
-rw-r--r--tests/testapp/models/__init__.py2
-rw-r--r--tests/testapp/models/m2m_intermediary.py71
2 files changed, 72 insertions, 1 deletions
diff --git a/tests/testapp/models/__init__.py b/tests/testapp/models/__init__.py
index 08a7671fb3..7b7ae3ea7b 100644
--- a/tests/testapp/models/__init__.py
+++ b/tests/testapp/models/__init__.py
@@ -1 +1 @@
-__all__ = ['basic', 'repr', 'custom_methods', 'many_to_one', 'many_to_many', 'ordering', 'lookup', 'get_latest']
+__all__ = ['basic', 'repr', 'custom_methods', 'many_to_one', 'many_to_many', 'ordering', 'lookup', 'get_latest', 'm2m_intermediary']
diff --git a/tests/testapp/models/m2m_intermediary.py b/tests/testapp/models/m2m_intermediary.py
new file mode 100644
index 0000000000..0ec25293f7
--- /dev/null
+++ b/tests/testapp/models/m2m_intermediary.py
@@ -0,0 +1,71 @@
+"""
+9. Many-to-many relationships via an intermediary table
+
+For many-to-many relationships that need extra fields on the intermediary
+table, use an intermediary model.
+
+In this example, an article can have multiple reporters, and each
+article-reporter combination (a "Writer") has a "position" field, which
+specifies the reporter's position for the given article (e.g. "Staff writer").
+"""
+
+from django.core import meta
+
+class Reporter(meta.Model):
+ fields = (
+ meta.CharField('first_name', maxlength=30),
+ meta.CharField('last_name', maxlength=30),
+ )
+
+ def __repr__(self):
+ return "%s %s" % (self.first_name, self.last_name)
+
+class Article(meta.Model):
+ fields = (
+ meta.CharField('headline', maxlength=100),
+ meta.DateField('pub_date'),
+ )
+
+ def __repr__(self):
+ return self.headline
+
+class Writer(meta.Model):
+ fields = (
+ meta.ForeignKey(Reporter),
+ meta.ForeignKey(Article),
+ meta.CharField('position', maxlength=100),
+ )
+
+ def __repr__(self):
+ return '%r (%s)' % (self.get_reporter(), self.position)
+
+API_TESTS = """
+# Create a few Reporters.
+>>> r1 = reporters.Reporter(id=None, first_name='John', last_name='Smith')
+>>> r1.save()
+>>> r2 = reporters.Reporter(id=None, first_name='Jane', last_name='Doe')
+>>> r2.save()
+
+# Create an Article.
+>>> from datetime import datetime
+>>> a = articles.Article(id=None, headline='This is a test', pub_date=datetime(2005, 7, 27))
+>>> a.save()
+
+# Create a few Writers.
+>>> w1 = writers.Writer(id=None, reporter_id=r1.id, article_id=a.id, position='Main writer')
+>>> w1.save()
+>>> w2 = writers.Writer(id=None, reporter_id=r2.id, article_id=a.id, position='Contributor')
+>>> w2.save()
+
+# Play around with the API.
+>>> a.get_writer_list(order_by=['-position'], select_related=True)
+[John Smith (Main writer), Jane Doe (Contributor)]
+>>> w1.get_reporter()
+John Smith
+>>> w2.get_reporter()
+Jane Doe
+>>> w1.get_article()
+This is a test
+>>> w2.get_article()
+This is a test
+"""