diff options
| author | Adrian Holovaty <adrian@holovaty.com> | 2005-07-29 20:30:10 +0000 |
|---|---|---|
| committer | Adrian Holovaty <adrian@holovaty.com> | 2005-07-29 20:30:10 +0000 |
| commit | 33d5006cc7436363a01acbf3e2181ea317794939 (patch) | |
| tree | 1809b3e7362b5e8caee71c2df84502a138241a1e /tests | |
| parent | 645111894657f12f0acc8be1f56676a461d81b6d (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__.py | 2 | ||||
| -rw-r--r-- | tests/testapp/models/m2m_intermediary.py | 71 |
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 +""" |
