From 33d5006cc7436363a01acbf3e2181ea317794939 Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Fri, 29 Jul 2005 20:30:10 +0000 Subject: [PATCH] Added m2m_intermediary model unit test/example git-svn-id: http://code.djangoproject.com/svn/django/trunk@344 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- tests/testapp/models/__init__.py | 2 +- tests/testapp/models/m2m_intermediary.py | 71 ++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 tests/testapp/models/m2m_intermediary.py 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 +"""