diff --git a/tests/lookup/tests.py b/tests/lookup/tests.py index 6a6729ef22..d0ffc25852 100644 --- a/tests/lookup/tests.py +++ b/tests/lookup/tests.py @@ -5,7 +5,6 @@ from operator import attrgetter from django.core.exceptions import FieldError from django.test import TestCase, skipUnlessDBFeature -from django.utils import six from shared_models.models import Author, Book @@ -21,19 +20,19 @@ class LookupTests(TestCase): self.au2 = Author(name='Author 2') self.au2.save() # Create a couple of Books. - self.b1 = Book(title='Book 1', pubdate=datetime(2005, 7, 26), author=self.au1) + self.b1 = Book(name='Book 1', pubdate=datetime(2005, 7, 26), author=self.au1) self.b1.save() - self.b2 = Book(title='Book 2', pubdate=datetime(2005, 7, 27), author=self.au1) + self.b2 = Book(name='Book 2', pubdate=datetime(2005, 7, 27), author=self.au1) self.b2.save() - self.b3 = Book(title='Book 3', pubdate=datetime(2005, 7, 27), author=self.au1) + self.b3 = Book(name='Book 3', pubdate=datetime(2005, 7, 27), author=self.au1) self.b3.save() - self.b4 = Book(title='Book 4', pubdate=datetime(2005, 7, 28), author=self.au1) + self.b4 = Book(name='Book 4', pubdate=datetime(2005, 7, 28), author=self.au1) self.b4.save() - self.b5 = Book(title='Book 5', pubdate=datetime(2005, 8, 1, 9, 0), author=self.au2) + self.b5 = Book(name='Book 5', pubdate=datetime(2005, 8, 1, 9, 0), author=self.au2) self.b5.save() - self.b6 = Book(title='Book 6', pubdate=datetime(2005, 8, 1, 8, 0), author=self.au2) + self.b6 = Book(name='Book 6', pubdate=datetime(2005, 8, 1, 8, 0), author=self.au2) self.b6.save() - self.b7 = Book(title='Book 7', pubdate=datetime(2005, 7, 27), author=self.au2) + self.b7 = Book(name='Book 7', pubdate=datetime(2005, 7, 27), author=self.au2) self.b7.save() # Create a few Tags. self.t1 = Tag(name='Tag 1') @@ -86,18 +85,18 @@ class LookupTests(TestCase): 'Book 7', 'Book 1', ], - transform=attrgetter('title')) + transform=attrgetter('name')) # iterator() can be used on any QuerySet. self.assertQuerysetEqual( - Book.objects.filter(title__endswith='4').iterator(), + Book.objects.filter(name__endswith='4').iterator(), ['Book 4'], - transform=attrgetter('title')) + transform=attrgetter('name')) def test_count(self): # count() returns the number of objects matching search criteria. self.assertEqual(Book.objects.count(), 7) self.assertEqual(Book.objects.filter(pubdate__exact=datetime(2005, 7, 27)).count(), 3) - self.assertEqual(Book.objects.filter(title__startswith='Blah blah').count(), 0) + self.assertEqual(Book.objects.filter(name__startswith='Blah blah').count(), 0) # count() should respect sliced query sets. articles = Book.objects.all() @@ -129,43 +128,43 @@ class LookupTests(TestCase): # values() returns a list of dictionaries instead of object instances -- # and you can specify which fields you want to retrieve. identity = lambda x:x - self.assertQuerysetEqual(Book.objects.values('title'), + self.assertQuerysetEqual(Book.objects.values('name'), [ - {'title': 'Book 5'}, - {'title': 'Book 6'}, - {'title': 'Book 4'}, - {'title': 'Book 2'}, - {'title': 'Book 3'}, - {'title': 'Book 7'}, - {'title': 'Book 1'}, + {'name': 'Book 5'}, + {'name': 'Book 6'}, + {'name': 'Book 4'}, + {'name': 'Book 2'}, + {'name': 'Book 3'}, + {'name': 'Book 7'}, + {'name': 'Book 1'}, ], transform=identity) self.assertQuerysetEqual( Book.objects.filter(pubdate__exact=datetime(2005, 7, 27)).values('id'), [{'id': self.b2.id}, {'id': self.b3.id}, {'id': self.b7.id}], transform=identity) - self.assertQuerysetEqual(Book.objects.values('id', 'title'), + self.assertQuerysetEqual(Book.objects.values('id', 'name'), [ - {'id': self.b5.id, 'title': 'Book 5'}, - {'id': self.b6.id, 'title': 'Book 6'}, - {'id': self.b4.id, 'title': 'Book 4'}, - {'id': self.b2.id, 'title': 'Book 2'}, - {'id': self.b3.id, 'title': 'Book 3'}, - {'id': self.b7.id, 'title': 'Book 7'}, - {'id': self.b1.id, 'title': 'Book 1'}, + {'id': self.b5.id, 'name': 'Book 5'}, + {'id': self.b6.id, 'name': 'Book 6'}, + {'id': self.b4.id, 'name': 'Book 4'}, + {'id': self.b2.id, 'name': 'Book 2'}, + {'id': self.b3.id, 'name': 'Book 3'}, + {'id': self.b7.id, 'name': 'Book 7'}, + {'id': self.b1.id, 'name': 'Book 1'}, ], transform=identity) # You can use values() with iterator() for memory savings, # because iterator() uses database-level iteration. - self.assertQuerysetEqual(Book.objects.values('id', 'title').iterator(), + self.assertQuerysetEqual(Book.objects.values('id', 'name').iterator(), [ - {'title': 'Book 5', 'id': self.b5.id}, - {'title': 'Book 6', 'id': self.b6.id}, - {'title': 'Book 4', 'id': self.b4.id}, - {'title': 'Book 2', 'id': self.b2.id}, - {'title': 'Book 3', 'id': self.b3.id}, - {'title': 'Book 7', 'id': self.b7.id}, - {'title': 'Book 1', 'id': self.b1.id}, + {'name': 'Book 5', 'id': self.b5.id}, + {'name': 'Book 6', 'id': self.b6.id}, + {'name': 'Book 4', 'id': self.b4.id}, + {'name': 'Book 2', 'id': self.b2.id}, + {'name': 'Book 3', 'id': self.b3.id}, + {'name': 'Book 7', 'id': self.b7.id}, + {'name': 'Book 1', 'id': self.b1.id}, ], transform=identity) # The values() method works with "extra" fields specified in extra(select). @@ -205,39 +204,39 @@ class LookupTests(TestCase): }], transform=identity) # You can specify fields from forward and reverse relations, just like filter(). self.assertQuerysetEqual( - Book.objects.values('title', 'author__name'), + Book.objects.values('name', 'author__name'), [ - {'title': self.b5.title, 'author__name': self.au2.name}, - {'title': self.b6.title, 'author__name': self.au2.name}, - {'title': self.b4.title, 'author__name': self.au1.name}, - {'title': self.b2.title, 'author__name': self.au1.name}, - {'title': self.b3.title, 'author__name': self.au1.name}, - {'title': self.b7.title, 'author__name': self.au2.name}, - {'title': self.b1.title, 'author__name': self.au1.name}, + {'name': self.b5.name, 'author__name': self.au2.name}, + {'name': self.b6.name, 'author__name': self.au2.name}, + {'name': self.b4.name, 'author__name': self.au1.name}, + {'name': self.b2.name, 'author__name': self.au1.name}, + {'name': self.b3.name, 'author__name': self.au1.name}, + {'name': self.b7.name, 'author__name': self.au2.name}, + {'name': self.b1.name, 'author__name': self.au1.name}, ], transform=identity) self.assertQuerysetEqual( - Author.objects.values('name', 'book__title').order_by('name', 'book__title'), + Author.objects.values('name', 'book__name').order_by('name', 'book__name'), [ - {'name': self.au1.name, 'book__title': self.b1.title}, - {'name': self.au1.name, 'book__title': self.b2.title}, - {'name': self.au1.name, 'book__title': self.b3.title}, - {'name': self.au1.name, 'book__title': self.b4.title}, - {'name': self.au2.name, 'book__title': self.b5.title}, - {'name': self.au2.name, 'book__title': self.b6.title}, - {'name': self.au2.name, 'book__title': self.b7.title}, + {'name': self.au1.name, 'book__name': self.b1.name}, + {'name': self.au1.name, 'book__name': self.b2.name}, + {'name': self.au1.name, 'book__name': self.b3.name}, + {'name': self.au1.name, 'book__name': self.b4.name}, + {'name': self.au2.name, 'book__name': self.b5.name}, + {'name': self.au2.name, 'book__name': self.b6.name}, + {'name': self.au2.name, 'book__name': self.b7.name}, ], transform=identity) self.assertQuerysetEqual( - Author.objects.values('name', 'book__title', 'book__tag__name').order_by('name', 'book__title', 'book__tag__name'), + Author.objects.values('name', 'book__name', 'book__tag__name').order_by('name', 'book__name', 'book__tag__name'), [ - {'name': self.au1.name, 'book__title': self.b1.title, 'book__tag__name': self.t1.name}, - {'name': self.au1.name, 'book__title': self.b2.title, 'book__tag__name': self.t1.name}, - {'name': self.au1.name, 'book__title': self.b3.title, 'book__tag__name': self.t1.name}, - {'name': self.au1.name, 'book__title': self.b3.title, 'book__tag__name': self.t2.name}, - {'name': self.au1.name, 'book__title': self.b4.title, 'book__tag__name': self.t2.name}, - {'name': self.au2.name, 'book__title': self.b5.title, 'book__tag__name': self.t2.name}, - {'name': self.au2.name, 'book__title': self.b5.title, 'book__tag__name': self.t3.name}, - {'name': self.au2.name, 'book__title': self.b6.title, 'book__tag__name': self.t3.name}, - {'name': self.au2.name, 'book__title': self.b7.title, 'book__tag__name': self.t3.name}, + {'name': self.au1.name, 'book__name': self.b1.name, 'book__tag__name': self.t1.name}, + {'name': self.au1.name, 'book__name': self.b2.name, 'book__tag__name': self.t1.name}, + {'name': self.au1.name, 'book__name': self.b3.name, 'book__tag__name': self.t1.name}, + {'name': self.au1.name, 'book__name': self.b3.name, 'book__tag__name': self.t2.name}, + {'name': self.au1.name, 'book__name': self.b4.name, 'book__tag__name': self.t2.name}, + {'name': self.au2.name, 'book__name': self.b5.name, 'book__tag__name': self.t2.name}, + {'name': self.au2.name, 'book__name': self.b5.name, 'book__tag__name': self.t3.name}, + {'name': self.au2.name, 'book__name': self.b6.name, 'book__tag__name': self.t3.name}, + {'name': self.au2.name, 'book__name': self.b7.name, 'book__tag__name': self.t3.name}, ], transform=identity) # However, an exception FieldDoesNotExist will be thrown if you specify # a non-existent field name in values() (a field that is neither in the @@ -250,7 +249,7 @@ class LookupTests(TestCase): [{ 'id': self.b5.id, 'author_id': self.au2.id, - 'title': 'Book 5', + 'name': 'Book 5', 'pages': 0, 'pubdate': datetime(2005, 8, 1, 9, 0) }], transform=identity) @@ -261,7 +260,7 @@ class LookupTests(TestCase): # Within each tuple, the order of the elements is the same as the order # of fields in the values_list() call. identity = lambda x:x - self.assertQuerysetEqual(Book.objects.values_list('title'), + self.assertQuerysetEqual(Book.objects.values_list('name'), [ ('Book 5',), ('Book 6',), @@ -310,19 +309,19 @@ class LookupTests(TestCase): ], transform=identity) self.assertQuerysetEqual( - Author.objects.values_list('name', 'book__title', 'book__tag__name').order_by('name', 'book__title', 'book__tag__name'), + Author.objects.values_list('name', 'book__name', 'book__tag__name').order_by('name', 'book__name', 'book__tag__name'), [ - (self.au1.name, self.b1.title, self.t1.name), - (self.au1.name, self.b2.title, self.t1.name), - (self.au1.name, self.b3.title, self.t1.name), - (self.au1.name, self.b3.title, self.t2.name), - (self.au1.name, self.b4.title, self.t2.name), - (self.au2.name, self.b5.title, self.t2.name), - (self.au2.name, self.b5.title, self.t3.name), - (self.au2.name, self.b6.title, self.t3.name), - (self.au2.name, self.b7.title, self.t3.name), + (self.au1.name, self.b1.name, self.t1.name), + (self.au1.name, self.b2.name, self.t1.name), + (self.au1.name, self.b3.name, self.t1.name), + (self.au1.name, self.b3.name, self.t2.name), + (self.au1.name, self.b4.name, self.t2.name), + (self.au2.name, self.b5.name, self.t2.name), + (self.au2.name, self.b5.name, self.t3.name), + (self.au2.name, self.b6.name, self.t3.name), + (self.au2.name, self.b7.name, self.t3.name), ], transform=identity) - self.assertRaises(TypeError, Book.objects.values_list, 'id', 'title', flat=True) + self.assertRaises(TypeError, Book.objects.values_list, 'id', 'name', flat=True) def test_get_next_previous_by(self): # Every DateField and DateTimeField creates get_next_by_FOO() and @@ -333,7 +332,7 @@ class LookupTests(TestCase): '') self.assertEqual(repr(self.b2.get_next_by_pubdate()), '') - self.assertEqual(repr(self.b2.get_next_by_pubdate(title__endswith='6')), + self.assertEqual(repr(self.b2.get_next_by_pubdate(name__endswith='6')), '') self.assertEqual(repr(self.b3.get_next_by_pubdate()), '') @@ -361,9 +360,9 @@ class LookupTests(TestCase): def test_escaping(self): # Underscores, percent signs and backslashes have special meaning in the # underlying SQL code, but Django handles the quoting of them automatically. - b8 = Book(title='Book_ with underscore', pubdate=datetime(2005, 11, 20)) + b8 = Book(name='Book_ with underscore', pubdate=datetime(2005, 11, 20)) b8.save() - self.assertQuerysetEqual(Book.objects.filter(title__startswith='Book'), + self.assertQuerysetEqual(Book.objects.filter(name__startswith='Book'), [ '', '', @@ -374,11 +373,11 @@ class LookupTests(TestCase): '', '', ]) - self.assertQuerysetEqual(Book.objects.filter(title__startswith='Book_'), + self.assertQuerysetEqual(Book.objects.filter(name__startswith='Book_'), ['']) - b9 = Book(title='Book% with percent sign', pubdate=datetime(2005, 11, 21)) + b9 = Book(name='Book% with percent sign', pubdate=datetime(2005, 11, 21)) b9.save() - self.assertQuerysetEqual(Book.objects.filter(title__startswith='Book'), + self.assertQuerysetEqual(Book.objects.filter(name__startswith='Book'), [ '', '', @@ -390,21 +389,21 @@ class LookupTests(TestCase): '', '', ]) - self.assertQuerysetEqual(Book.objects.filter(title__startswith='Book%'), + self.assertQuerysetEqual(Book.objects.filter(name__startswith='Book%'), ['']) - b10 = Book(title='Book with \\ backslash', pubdate=datetime(2005, 11, 22)) + b10 = Book(name='Book with \\ backslash', pubdate=datetime(2005, 11, 22)) b10.save() - self.assertQuerysetEqual(Book.objects.filter(title__contains='\\'), + self.assertQuerysetEqual(Book.objects.filter(name__contains='\\'), ['']) def test_exclude(self): - b8 = Book.objects.create(title='Book_ with underscore', pubdate=datetime(2005, 11, 20)) - b9 = Book.objects.create(title='Book% with percent sign', pubdate=datetime(2005, 11, 21)) - b10 = Book.objects.create(title='Book with \\ backslash', pubdate=datetime(2005, 11, 22)) + b8 = Book.objects.create(name='Book_ with underscore', pubdate=datetime(2005, 11, 20)) + b9 = Book.objects.create(name='Book% with percent sign', pubdate=datetime(2005, 11, 21)) + b10 = Book.objects.create(name='Book with \\ backslash', pubdate=datetime(2005, 11, 22)) # exclude() is the opposite of filter() when doing lookups: self.assertQuerysetEqual( - Book.objects.filter(title__contains='Book').exclude(title__contains='with'), + Book.objects.filter(name__contains='Book').exclude(name__contains='with'), [ '', '', @@ -414,7 +413,7 @@ class LookupTests(TestCase): '', '', ]) - self.assertQuerysetEqual(Book.objects.exclude(title__startswith="Book_"), + self.assertQuerysetEqual(Book.objects.exclude(name__startswith="Book_"), [ '', '', @@ -426,7 +425,7 @@ class LookupTests(TestCase): '', '', ]) - self.assertQuerysetEqual(Book.objects.exclude(title="Book 7"), + self.assertQuerysetEqual(Book.objects.exclude(name="Book 7"), [ '', '', @@ -443,12 +442,12 @@ class LookupTests(TestCase): # none() returns a QuerySet that behaves like any other QuerySet object self.assertQuerysetEqual(Book.objects.none(), []) self.assertQuerysetEqual( - Book.objects.none().filter(title__startswith='Book'), []) + Book.objects.none().filter(name__startswith='Book'), []) self.assertQuerysetEqual( - Book.objects.filter(title__startswith='Book').none(), []) + Book.objects.filter(name__startswith='Book').none(), []) self.assertEqual(Book.objects.none().count(), 0) self.assertEqual( - Book.objects.none().update(title="This should not take effect"), 0) + Book.objects.none().update(name="This should not take effect"), 0) self.assertQuerysetEqual( [article for article in Book.objects.none().iterator()], []) @@ -469,41 +468,46 @@ class LookupTests(TestCase): def test_error_messages(self): # Programming errors are pointed out with nice error messages - with six.assertRaisesRegex(self, FieldError, "Cannot resolve keyword 'pubdate_year' " - "into field. Choices are: .+"): - Book.objects.filter(pubdate_year='2005').count() - - with self.assertRaises(FieldError, msg="Join on field 'title' not permitted. " - "Did you misspell 'starts' for the lookup type?"): - Book.objects.filter(title__starts='Book') + try: + Book.objects.filter(pubdate_year='2005').count() + self.fail('FieldError not raised') + except FieldError as ex: + self.assertEqual(str(ex), "Cannot resolve keyword 'pubdate_year' " + "into field. Choices are: author, id, name, pages, pubdate, tag, tags") + try: + Book.objects.filter(name__starts='Book') + self.fail('FieldError not raised') + except FieldError as ex: + self.assertEqual(str(ex), "Join on field 'name' not permitted. " + "Did you misspell 'starts' for the lookup type?") def test_regex(self): # Create some articles with a bit more interesting names for testing field lookups: for a in Book.objects.all(): a.delete() now = datetime.now() - b1 = Book(pubdate=now, title='f') + b1 = Book(pubdate=now, name='f') b1.save() - b2 = Book(pubdate=now, title='fo') + b2 = Book(pubdate=now, name='fo') b2.save() - b3 = Book(pubdate=now, title='foo') + b3 = Book(pubdate=now, name='foo') b3.save() - b4 = Book(pubdate=now, title='fooo') + b4 = Book(pubdate=now, name='fooo') b4.save() - b5 = Book(pubdate=now, title='hey-Foo') + b5 = Book(pubdate=now, name='hey-Foo') b5.save() - b6 = Book(pubdate=now, title='bar') + b6 = Book(pubdate=now, name='bar') b6.save() - b7 = Book(pubdate=now, title='AbBa') + b7 = Book(pubdate=now, name='AbBa') b7.save() - b8 = Book(pubdate=now, title='baz') + b8 = Book(pubdate=now, name='baz') b8.save() - b9 = Book(pubdate=now, title='baxZ') + b9 = Book(pubdate=now, name='baxZ') b9.save() # zero-or-more - self.assertQuerysetEqual(Book.objects.filter(title__regex=r'fo*'), + self.assertQuerysetEqual(Book.objects.filter(name__regex=r'fo*'), ['', '', '', '']) - self.assertQuerysetEqual(Book.objects.filter(title__iregex=r'fo*'), + self.assertQuerysetEqual(Book.objects.filter(name__iregex=r'fo*'), [ '', '', @@ -512,54 +516,54 @@ class LookupTests(TestCase): '', ]) # one-or-more - self.assertQuerysetEqual(Book.objects.filter(title__regex=r'fo+'), + self.assertQuerysetEqual(Book.objects.filter(name__regex=r'fo+'), ['', '', '']) # wildcard - self.assertQuerysetEqual(Book.objects.filter(title__regex=r'fooo?'), + self.assertQuerysetEqual(Book.objects.filter(name__regex=r'fooo?'), ['', '']) # leading anchor - self.assertQuerysetEqual(Book.objects.filter(title__regex=r'^b'), + self.assertQuerysetEqual(Book.objects.filter(name__regex=r'^b'), ['', '', '']) - self.assertQuerysetEqual(Book.objects.filter(title__iregex=r'^a'), + self.assertQuerysetEqual(Book.objects.filter(name__iregex=r'^a'), ['']) # trailing anchor - self.assertQuerysetEqual(Book.objects.filter(title__regex=r'z$'), + self.assertQuerysetEqual(Book.objects.filter(name__regex=r'z$'), ['']) - self.assertQuerysetEqual(Book.objects.filter(title__iregex=r'z$'), + self.assertQuerysetEqual(Book.objects.filter(name__iregex=r'z$'), ['', '']) # character sets - self.assertQuerysetEqual(Book.objects.filter(title__regex=r'ba[rz]'), + self.assertQuerysetEqual(Book.objects.filter(name__regex=r'ba[rz]'), ['', '']) - self.assertQuerysetEqual(Book.objects.filter(title__regex=r'ba.[RxZ]'), + self.assertQuerysetEqual(Book.objects.filter(name__regex=r'ba.[RxZ]'), ['']) - self.assertQuerysetEqual(Book.objects.filter(title__iregex=r'ba[RxZ]'), + self.assertQuerysetEqual(Book.objects.filter(name__iregex=r'ba[RxZ]'), ['', '', '']) # and more articles: - b10 = Book(pubdate=now, title='foobar') + b10 = Book(pubdate=now, name='foobar') b10.save() - b11 = Book(pubdate=now, title='foobaz') + b11 = Book(pubdate=now, name='foobaz') b11.save() - b12 = Book(pubdate=now, title='ooF') + b12 = Book(pubdate=now, name='ooF') b12.save() - b13 = Book(pubdate=now, title='foobarbaz') + b13 = Book(pubdate=now, name='foobarbaz') b13.save() - b14 = Book(pubdate=now, title='zoocarfaz') + b14 = Book(pubdate=now, name='zoocarfaz') b14.save() - b15 = Book(pubdate=now, title='barfoobaz') + b15 = Book(pubdate=now, name='barfoobaz') b15.save() - b16 = Book(pubdate=now, title='bazbaRFOO') + b16 = Book(pubdate=now, name='bazbaRFOO') b16.save() # alternation - self.assertQuerysetEqual(Book.objects.filter(title__regex=r'oo(f|b)'), + self.assertQuerysetEqual(Book.objects.filter(name__regex=r'oo(f|b)'), [ '', '', '', '', ]) - self.assertQuerysetEqual(Book.objects.filter(title__iregex=r'oo(f|b)'), + self.assertQuerysetEqual(Book.objects.filter(name__iregex=r'oo(f|b)'), [ '', '', @@ -567,11 +571,11 @@ class LookupTests(TestCase): '', '', ]) - self.assertQuerysetEqual(Book.objects.filter(title__regex=r'^foo(f|b)'), + self.assertQuerysetEqual(Book.objects.filter(name__regex=r'^foo(f|b)'), ['', '', '']) # greedy matching - self.assertQuerysetEqual(Book.objects.filter(title__regex=r'b.*az'), + self.assertQuerysetEqual(Book.objects.filter(name__regex=r'b.*az'), [ '', '', @@ -579,7 +583,7 @@ class LookupTests(TestCase): '', '', ]) - self.assertQuerysetEqual(Book.objects.filter(title__iregex=r'b.*ar'), + self.assertQuerysetEqual(Book.objects.filter(name__iregex=r'b.*ar'), [ '', '', @@ -592,21 +596,21 @@ class LookupTests(TestCase): def test_regex_backreferencing(self): # grouping and backreferences now = datetime.now() - b10 = Book(pubdate=now, title='foobar') + b10 = Book(pubdate=now, name='foobar') b10.save() - b11 = Book(pubdate=now, title='foobaz') + b11 = Book(pubdate=now, name='foobaz') b11.save() - b12 = Book(pubdate=now, title='ooF') + b12 = Book(pubdate=now, name='ooF') b12.save() - b13 = Book(pubdate=now, title='foobarbaz') + b13 = Book(pubdate=now, name='foobarbaz') b13.save() - b14 = Book(pubdate=now, title='zoocarfaz') + b14 = Book(pubdate=now, name='zoocarfaz') b14.save() - b15 = Book(pubdate=now, title='barfoobaz') + b15 = Book(pubdate=now, name='barfoobaz') b15.save() - b16 = Book(pubdate=now, title='bazbaRFOO') + b16 = Book(pubdate=now, name='bazbaRFOO') b16.save() - self.assertQuerysetEqual(Book.objects.filter(title__regex=r'b(.).*b\1'), + self.assertQuerysetEqual(Book.objects.filter(name__regex=r'b(.).*b\1'), ['', '', '']) def test_nonfield_lookups(self): diff --git a/tests/model_forms/models.py b/tests/model_forms/models.py index 610dc34001..a798f9bf95 100644 --- a/tests/model_forms/models.py +++ b/tests/model_forms/models.py @@ -17,7 +17,6 @@ from django.db import models from django.utils import six from django.utils.encoding import python_2_unicode_compatible -from shared_models.models import Author, Book temp_storage_dir = tempfile.mkdtemp(dir=os.environ['DJANGO_TEST_TEMP_DIR']) temp_storage = FileSystemStorage(temp_storage_dir) @@ -46,13 +45,23 @@ class Category(models.Model): def __repr__(self): return self.__str__() +@python_2_unicode_compatible +class Writer(models.Model): + name = models.CharField(max_length=50, help_text='Use both first and last names.') + + class Meta: + ordering = ('name',) + + def __str__(self): + return self.name + @python_2_unicode_compatible class Article(models.Model): headline = models.CharField(max_length=50) slug = models.SlugField() pub_date = models.DateField() created = models.DateField(editable=False) - writer = models.ForeignKey(Author) + writer = models.ForeignKey(Writer) article = models.TextField() categories = models.ManyToManyField(Category, blank=True) status = models.PositiveIntegerField(choices=ARTICLE_STATUS, blank=True, null=True) @@ -72,12 +81,12 @@ class ImprovedArticle(models.Model): class ImprovedArticleWithParentLink(models.Model): article = models.OneToOneField(Article, parent_link=True) -class BetterAuthor(Author): +class BetterWriter(Writer): score = models.IntegerField() @python_2_unicode_compatible -class AuthorProfile(models.Model): - writer = models.OneToOneField(Author, primary_key=True) +class WriterProfile(models.Model): + writer = models.OneToOneField(Writer, primary_key=True) age = models.PositiveIntegerField() def __str__(self): @@ -177,6 +186,14 @@ class Inventory(models.Model): def __repr__(self): return self.__str__() +class Book(models.Model): + title = models.CharField(max_length=40) + author = models.ForeignKey(Writer, blank=True, null=True) + special_id = models.IntegerField(blank=True, null=True, unique=True) + + class Meta: + unique_together = ('title', 'author') + class BookXtra(models.Model): isbn = models.CharField(max_length=16, unique=True) suffix1 = models.IntegerField(blank=True, default=0) diff --git a/tests/model_forms/tests.py b/tests/model_forms/tests.py index 58dde13a8a..509413fb61 100644 --- a/tests/model_forms/tests.py +++ b/tests/model_forms/tests.py @@ -17,13 +17,11 @@ from django.utils.unittest import skipUnless from django.test import TestCase from django.utils import six -from shared_models.models import Author, Book - -from .models import (Article, ArticleStatus, BetterAuthor, BigInt, +from .models import (Article, ArticleStatus, BetterWriter, BigInt, Book, Category, CommaSeparatedInteger, CustomFieldForExclusionModel, DerivedBook, DerivedPost, ExplicitPK, FlexibleDatePost, ImprovedArticle, ImprovedArticleWithParentLink, Inventory, Post, Price, - Product, TextFile, AuthorProfile, Colour, ColourfulItem, + Product, TextFile, Writer, WriterProfile, Colour, ColourfulItem, ArticleStatusNote, DateTimePost, test_images) if test_images: @@ -54,13 +52,11 @@ class PriceForm(forms.ModelForm): class BookForm(forms.ModelForm): class Meta: - fields = ['title', 'author', 'pubdate'] - model = Book + model = Book class DerivedBookForm(forms.ModelForm): class Meta: - fields = ['title', 'author', 'isbn', 'suffix1', 'suffix2'] model = DerivedBook @@ -88,11 +84,11 @@ class DerivedPostForm(forms.ModelForm): fields = '__all__' -class CustomAuthorForm(forms.ModelForm): +class CustomWriterForm(forms.ModelForm): name = forms.CharField(required=False) class Meta: - model = Author + model = Writer fields = '__all__' @@ -128,7 +124,7 @@ class PartialArticleForm(forms.ModelForm): class RoykoForm(forms.ModelForm): class Meta: - model = Author + model = Writer fields = '__all__' @@ -188,15 +184,14 @@ class ImprovedArticleWithParentLinkForm(forms.ModelForm): fields = '__all__' -class BetterAuthorForm(forms.ModelForm): +class BetterWriterForm(forms.ModelForm): class Meta: - model = BetterAuthor + model = BetterWriter fields = '__all__' - -class AuthorProfileForm(forms.ModelForm): +class WriterProfileForm(forms.ModelForm): class Meta: - model = AuthorProfile + model = WriterProfile fields = '__all__' @@ -324,14 +319,14 @@ class ModelFormBaseTest(TestCase): forms.fields.BooleanField) def test_override_field(self): - class AuthorForm(forms.ModelForm): + class WriterForm(forms.ModelForm): book = forms.CharField(required=False) class Meta: - model = Author + model = Writer fields = '__all__' - wf = AuthorForm({'name': 'Richard Lockridge'}) + wf = WriterForm({'name': 'Richard Lockridge'}) self.assertTrue(wf.is_valid()) def test_limit_nonexistent_field(self): @@ -556,7 +551,7 @@ class ValidationTest(TestCase): assert form.is_valid() def test_notrequired_overrides_notblank(self): - form = CustomAuthorForm({}) + form = CustomWriterForm({}) assert form.is_valid() @@ -565,7 +560,7 @@ class ValidationTest(TestCase): # unique/unique_together validation class UniqueTest(TestCase): def setUp(self): - self.author = Author.objects.create(name='Mike Royko') + self.writer = Writer.objects.create(name='Mike Royko') def test_simple_unique(self): form = ProductForm({'slug': 'teddy-bear-blue'}) @@ -589,31 +584,33 @@ class UniqueTest(TestCase): def test_unique_null(self): title = 'I May Be Wrong But I Doubt It' - form = BookForm({'title': title, 'author': self.author.pk, 'pubdate': '2012-12-12 00:00:00'}) + form = BookForm({'title': title, 'author': self.writer.pk}) self.assertTrue(form.is_valid()) form.save() - form = BookForm({'title': title, 'author': self.author.pk, 'pubdate': '2012-12-12 00:00:00'}) + form = BookForm({'title': title, 'author': self.writer.pk}) self.assertFalse(form.is_valid()) self.assertEqual(len(form.errors), 1) self.assertEqual(form.errors['__all__'], ['Book with this Title and Author already exists.']) - form = BookForm({'title': title, 'pubdate': '2012-12-12 00:00:00'}) + form = BookForm({'title': title}) self.assertTrue(form.is_valid()) form.save() - form = BookForm({'title': title, 'pubdate': '2012-12-12 00:00:00'}) + form = BookForm({'title': title}) self.assertTrue(form.is_valid()) def test_inherited_unique(self): - form = BetterAuthorForm({'name': 'Mike Royko', 'score': 3}) + title = 'Boss' + Book.objects.create(title=title, author=self.writer, special_id=1) + form = DerivedBookForm({'title': 'Other', 'author': self.writer.pk, 'special_id': '1', 'isbn': '12345'}) self.assertFalse(form.is_valid()) self.assertEqual(len(form.errors), 1) - self.assertEqual(form.errors['name'], ['Author with this Name already exists.']) + self.assertEqual(form.errors['special_id'], ['Book with this Special id already exists.']) def test_inherited_unique_together(self): title = 'Boss' - form = BookForm({'title': title, 'author': self.author.pk, 'pubdate': '2012-12-12 00:00:00'}) + form = BookForm({'title': title, 'author': self.writer.pk}) self.assertTrue(form.is_valid()) form.save() - form = DerivedBookForm({'title': title, 'author': self.author.pk, 'isbn': '12345'}) + form = DerivedBookForm({'title': title, 'author': self.writer.pk, 'isbn': '12345'}) self.assertFalse(form.is_valid()) self.assertEqual(len(form.errors), 1) self.assertEqual(form.errors['__all__'], ['Book with this Title and Author already exists.']) @@ -621,9 +618,8 @@ class UniqueTest(TestCase): def test_abstract_inherited_unique(self): title = 'Boss' isbn = '12345' - dbook = DerivedBook.objects.create(title=title, author=self.author, isbn=isbn, - pubdate='2012-12-12 00:00') - form = DerivedBookForm({'title': 'Other', 'author': self.author.pk, 'isbn': isbn}) + dbook = DerivedBook.objects.create(title=title, author=self.writer, isbn=isbn) + form = DerivedBookForm({'title': 'Other', 'author': self.writer.pk, 'isbn': isbn}) self.assertFalse(form.is_valid()) self.assertEqual(len(form.errors), 1) self.assertEqual(form.errors['isbn'], ['Derived book with this Isbn already exists.']) @@ -631,11 +627,10 @@ class UniqueTest(TestCase): def test_abstract_inherited_unique_together(self): title = 'Boss' isbn = '12345' - dbook = DerivedBook.objects.create(title=title, author=self.author, isbn=isbn, - pubdate='2012-12-12 00:00') + dbook = DerivedBook.objects.create(title=title, author=self.writer, isbn=isbn) form = DerivedBookForm({ 'title': 'Other', - 'author': self.author.pk, + 'author': self.writer.pk, 'isbn': '9876', 'suffix1': '0', 'suffix2': '0' @@ -753,7 +748,7 @@ class ModelToDictTests(TestCase): ] for c in categories: c.save() - writer = Author(name='Test writer') + writer = Writer(name='Test writer') writer.save() art = Article( @@ -862,10 +857,10 @@ class OldFormForXTests(TestCase): with self.assertRaises(ValueError): f.save() - # Create a couple of Authors. - w_royko = Author(name='Mike Royko') + # Create a couple of Writers. + w_royko = Writer(name='Mike Royko') w_royko.save() - w_woodward = Author(name='Bob Woodward') + w_woodward = Writer(name='Bob Woodward') w_woodward.save() # ManyToManyFields are represented by a MultipleChoiceField, ForeignKeys and any # fields with the 'choices' attribute are represented by a ChoiceField. @@ -903,9 +898,9 @@ class OldFormForXTests(TestCase): # When the ModelForm is passed an instance, that instance's current values are # inserted as 'initial' data in each Field. - w = Author.objects.get(name='Mike Royko') + w = Writer.objects.get(name='Mike Royko') f = RoykoForm(auto_id=False, instance=w) - self.assertHTMLEqual(six.text_type(f), '''Name:
Use both first and last names.''') + self.assertHTMLEqual(six.text_type(f), '''Name:
Use both first and last names.''') art = Article( headline='Test article', @@ -1117,7 +1112,7 @@ class OldFormForXTests(TestCase): c4 = Category.objects.create(name='Fourth', url='4th') self.assertEqual(c4.name, 'Fourth') - w_bernstein = Author.objects.create(name='Carl Bernstein') + w_bernstein = Writer.objects.create(name='Carl Bernstein') self.assertEqual(w_bernstein.name, 'Carl Bernstein') self.assertHTMLEqual(f.as_ul(), '''
  • Headline:
  • Slug:
  • @@ -1294,17 +1289,17 @@ class OldFormForXTests(TestCase): self.assertEqual(list(ImprovedArticleWithParentLinkForm.base_fields), []) - bw = BetterAuthor(name='Joe Better', score=10) + bw = BetterWriter(name='Joe Better', score=10) bw.save() self.assertEqual(sorted(model_to_dict(bw)), - ['author_ptr', 'id', 'name', 'score']) + ['id', 'name', 'score', 'writer_ptr']) - form = BetterAuthorForm({'name': 'Some Name', 'score': 12}) + form = BetterWriterForm({'name': 'Some Name', 'score': 12}) self.assertEqual(form.is_valid(), True) bw2 = form.save() bw2.delete() - form = AuthorProfileForm() + form = WriterProfileForm() self.assertHTMLEqual(form.as_p(), '''

    diff --git a/tests/shared_models/models.py b/tests/shared_models/models.py index 145edad1bf..61b3669bc4 100644 --- a/tests/shared_models/models.py +++ b/tests/shared_models/models.py @@ -1,5 +1,3 @@ -from __future__ import unicode_literals - from django.db import models from django.utils import timezone from django.utils.encoding import python_2_unicode_compatible @@ -11,11 +9,7 @@ class Tag(models.Model): @python_2_unicode_compatible class Author(models.Model): - name = models.CharField(max_length=100, help_text='Use both first and last names.', - unique=True) - - class Meta: - ordering = ['name'] + name = models.CharField(max_length=100) def __str__(self): return self.name @@ -23,15 +17,14 @@ class Author(models.Model): @python_2_unicode_compatible class Book(models.Model): - title = models.CharField(max_length=200) + name = models.CharField(max_length=200) pages = models.IntegerField(default=0) - author = models.ForeignKey(Author, null=True, blank=True) + author = models.ForeignKey(Author, null=True) pubdate = models.DateTimeField() tags = models.ManyToManyField(Tag) class Meta: - ordering = ['-pubdate', 'title'] - unique_together = ['title', 'author'] + ordering = ['-pubdate', 'name'] def __str__(self): - return self.title + return self.name diff --git a/tests/signals_regress/tests.py b/tests/signals_regress/tests.py index b806d2116e..0c92b96c24 100644 --- a/tests/signals_regress/tests.py +++ b/tests/signals_regress/tests.py @@ -77,7 +77,7 @@ class SignalsRegressTests(TestCase): "Is created" ]) - b1 = Book(title='Snow Crash', pubdate='2012-02-02 12:00') + b1 = Book(name='Snow Crash', pubdate='2012-02-02 12:00') self.assertEqual(self.get_signal_output(b1.save), [ "pre_save signal, Snow Crash", "post_save signal, Snow Crash", @@ -87,7 +87,7 @@ class SignalsRegressTests(TestCase): def test_m2m_signals(self): """ Assigning and removing to/from m2m shouldn't generate an m2m signal """ - b1 = Book(title='Snow Crash', pubdate='2012-02-02 12:00') + b1 = Book(name='Snow Crash', pubdate='2012-02-02 12:00') self.get_signal_output(b1.save) a1 = Author(name='Neal Stephenson') self.get_signal_output(a1.save)