diff options
author | Florian Apolloner <florian@apolloner.eu> | 2013-02-26 09:53:47 +0100 |
---|---|---|
committer | Florian Apolloner <florian@apolloner.eu> | 2013-02-26 14:36:57 +0100 |
commit | 89f40e36246100df6a11316c31a76712ebc6c501 (patch) | |
tree | 6e65639683ddaf2027908d1ecb1739e0e2ff853b /tests/custom_columns | |
parent | b3d2ccb5bfbaf6e7fe1f98843baaa48c35a70950 (diff) | |
download | django-89f40e36246100df6a11316c31a76712ebc6c501.tar.gz |
Merged regressiontests and modeltests into the test root.
Diffstat (limited to 'tests/custom_columns')
-rw-r--r-- | tests/custom_columns/__init__.py | 0 | ||||
-rw-r--r-- | tests/custom_columns/models.py | 46 | ||||
-rw-r--r-- | tests/custom_columns/tests.py | 74 |
3 files changed, 120 insertions, 0 deletions
diff --git a/tests/custom_columns/__init__.py b/tests/custom_columns/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/custom_columns/__init__.py diff --git a/tests/custom_columns/models.py b/tests/custom_columns/models.py new file mode 100644 index 0000000000..16f0563d6b --- /dev/null +++ b/tests/custom_columns/models.py @@ -0,0 +1,46 @@ +""" +17. Custom column/table names + +If your database column name is different than your model attribute, use the +``db_column`` parameter. Note that you'll use the field's name, not its column +name, in API usage. + +If your database table name is different than your model name, use the +``db_table`` Meta attribute. This has no effect on the API used to +query the database. + +If you need to use a table name for a many-to-many relationship that differs +from the default generated name, use the ``db_table`` parameter on the +``ManyToManyField``. This has no effect on the API for querying the database. + +""" + +from __future__ import unicode_literals + +from django.db import models +from django.utils.encoding import python_2_unicode_compatible + + +@python_2_unicode_compatible +class Author(models.Model): + first_name = models.CharField(max_length=30, db_column='firstname') + last_name = models.CharField(max_length=30, db_column='last') + + def __str__(self): + return '%s %s' % (self.first_name, self.last_name) + + class Meta: + db_table = 'my_author_table' + ordering = ('last_name','first_name') + +@python_2_unicode_compatible +class Article(models.Model): + headline = models.CharField(max_length=100) + authors = models.ManyToManyField(Author, db_table='my_m2m_table') + + def __str__(self): + return self.headline + + class Meta: + ordering = ('headline',) + diff --git a/tests/custom_columns/tests.py b/tests/custom_columns/tests.py new file mode 100644 index 0000000000..a2e5323a75 --- /dev/null +++ b/tests/custom_columns/tests.py @@ -0,0 +1,74 @@ +from __future__ import absolute_import + +from django.core.exceptions import FieldError +from django.test import TestCase +from django.utils import six + +from .models import Author, Article + + +class CustomColumnsTests(TestCase): + def test_db_column(self): + a1 = Author.objects.create(first_name="John", last_name="Smith") + a2 = Author.objects.create(first_name="Peter", last_name="Jones") + + art = Article.objects.create(headline="Django lets you build Web apps easily") + art.authors = [a1, a2] + + # Although the table and column names on Author have been set to custom + # values, nothing about using the Author model has changed... + + # Query the available authors + self.assertQuerysetEqual( + Author.objects.all(), [ + "Peter Jones", "John Smith", + ], + six.text_type + ) + self.assertQuerysetEqual( + Author.objects.filter(first_name__exact="John"), [ + "John Smith", + ], + six.text_type + ) + self.assertEqual( + Author.objects.get(first_name__exact="John"), + a1, + ) + + self.assertRaises(FieldError, + lambda: Author.objects.filter(firstname__exact="John") + ) + + a = Author.objects.get(last_name__exact="Smith") + a.first_name = "John" + a.last_name = "Smith" + + self.assertRaises(AttributeError, lambda: a.firstname) + self.assertRaises(AttributeError, lambda: a.last) + + # Although the Article table uses a custom m2m table, + # nothing about using the m2m relationship has changed... + + # Get all the authors for an article + self.assertQuerysetEqual( + art.authors.all(), [ + "Peter Jones", + "John Smith", + ], + six.text_type + ) + # Get the articles for an author + self.assertQuerysetEqual( + a.article_set.all(), [ + "Django lets you build Web apps easily", + ], + lambda a: a.headline + ) + # Query the authors across the m2m relation + self.assertQuerysetEqual( + art.authors.filter(last_name='Jones'), [ + "Peter Jones" + ], + six.text_type + ) |