diff options
| author | Russell Keith-Magee <russell@keith-magee.com> | 2009-02-03 11:07:21 +0000 |
|---|---|---|
| committer | Russell Keith-Magee <russell@keith-magee.com> | 2009-02-03 11:07:21 +0000 |
| commit | ecadf675690c2cc9375e9af70ebd1528841eae76 (patch) | |
| tree | b2470a54ac83e70e285c4f465c832a298cc8fb9d /tests/modeltests | |
| parent | a008b5c9abae582ca31578ff7d6842d0d6b00e27 (diff) | |
Fixed #10127 -- Corrected (no, really, this time!) the way the select_related() cache is populated when annotations are also contained in the query. Thanks to Sylvain Pasche <sylvain.pasche@gmail.com> for the report and test case.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@9808 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests/modeltests')
| -rw-r--r-- | tests/modeltests/aggregation/fixtures/initial_data.json | 8 | ||||
| -rw-r--r-- | tests/modeltests/aggregation/models.py | 15 |
2 files changed, 15 insertions, 8 deletions
diff --git a/tests/modeltests/aggregation/fixtures/initial_data.json b/tests/modeltests/aggregation/fixtures/initial_data.json index 0ff26d9ed3..a0021001e7 100644 --- a/tests/modeltests/aggregation/fixtures/initial_data.json +++ b/tests/modeltests/aggregation/fixtures/initial_data.json @@ -49,6 +49,7 @@ "price": "30.00", "rating": 4.5, "authors": [1, 2], + "contact": 1, "pages": 447, "pubdate": "2007-12-6" } @@ -63,6 +64,7 @@ "price": "23.09", "rating": 3.0, "authors": [3], + "contact": 3, "pages": 528, "pubdate": "2008-3-3" } @@ -77,6 +79,7 @@ "price": "29.69", "rating": 4.0, "authors": [4], + "contact": 4, "pages": 300, "pubdate": "2008-6-23" } @@ -91,6 +94,7 @@ "price": "29.69", "rating": 4.0, "authors": [5, 6, 7], + "contact": 5, "pages": 350, "pubdate": "2008-11-3" } @@ -105,6 +109,7 @@ "price": "82.80", "rating": 4.0, "authors": [8, 9], + "contact": 8, "pages": 1132, "pubdate": "1995-1-15" } @@ -119,6 +124,7 @@ "price": "75.00", "rating": 5.0, "authors": [8], + "contact": 8, "pages": 946, "pubdate": "1991-10-15" } @@ -195,7 +201,7 @@ "fields": { "age": 37, "friends": [6, 7], - "name": "Jeffrey Forcier " + "name": "Jeffrey Forcier" } }, { diff --git a/tests/modeltests/aggregation/models.py b/tests/modeltests/aggregation/models.py index a94c475543..8537d0bd66 100644 --- a/tests/modeltests/aggregation/models.py +++ b/tests/modeltests/aggregation/models.py @@ -28,6 +28,7 @@ class Book(models.Model): rating = models.FloatField() price = models.DecimalField(decimal_places=2, max_digits=6) authors = models.ManyToManyField(Author) + contact = models.ForeignKey(Author, related_name='book_contact_set') publisher = models.ForeignKey(Publisher) pubdate = models.DateField() @@ -180,7 +181,7 @@ u'The Definitive Guide to Django: Web Development Done Right' # Count the number of books written by each author >>> authors = Author.objects.annotate(num_books=Count('book')) >>> sorted([(a.name, a.num_books) for a in authors]) -[(u'Adrian Holovaty', 1), (u'Brad Dayley', 1), (u'Jacob Kaplan-Moss', 1), (u'James Bennett', 1), (u'Jeffrey Forcier ', 1), (u'Paul Bissex', 1), (u'Peter Norvig', 2), (u'Stuart Russell', 1), (u'Wesley J. Chun', 1)] +[(u'Adrian Holovaty', 1), (u'Brad Dayley', 1), (u'Jacob Kaplan-Moss', 1), (u'James Bennett', 1), (u'Jeffrey Forcier', 1), (u'Paul Bissex', 1), (u'Peter Norvig', 2), (u'Stuart Russell', 1), (u'Wesley J. Chun', 1)] # On OneToMany Relationships @@ -201,7 +202,7 @@ u'The Definitive Guide to Django: Web Development Done Right' # Calling values on a queryset that has annotations returns the output # as a dictionary >>> Book.objects.filter(pk=1).annotate(mean_age=Avg('authors__age')).values() -[{'rating': 4.5, 'isbn': u'159059725', 'name': u'The Definitive Guide to Django: Web Development Done Right', 'pubdate': datetime.date(2007, 12, 6), 'price': Decimal("30..."), 'id': 1, 'publisher_id': 1, 'pages': 447, 'mean_age': 34.5}] +[{'rating': 4.5, 'isbn': u'159059725', 'name': u'The Definitive Guide to Django: Web Development Done Right', 'pubdate': datetime.date(2007, 12, 6), 'price': Decimal("30..."), 'contact_id': 1, 'id': 1, 'publisher_id': 1, 'pages': 447, 'mean_age': 34.5}] >>> Book.objects.filter(pk=1).annotate(mean_age=Avg('authors__age')).values('pk', 'isbn', 'mean_age') [{'pk': 1, 'isbn': u'159059725', 'mean_age': 34.5}] @@ -214,7 +215,7 @@ u'The Definitive Guide to Django: Web Development Done Right' # An empty values() call before annotating has the same effect as an # empty values() call after annotating >>> Book.objects.filter(pk=1).values().annotate(mean_age=Avg('authors__age')) -[{'rating': 4.5, 'isbn': u'159059725', 'name': u'The Definitive Guide to Django: Web Development Done Right', 'pubdate': datetime.date(2007, 12, 6), 'price': Decimal("30..."), 'id': 1, 'publisher_id': 1, 'pages': 447, 'mean_age': 34.5}] +[{'rating': 4.5, 'isbn': u'159059725', 'name': u'The Definitive Guide to Django: Web Development Done Right', 'pubdate': datetime.date(2007, 12, 6), 'price': Decimal("30..."), 'contact_id': 1, 'id': 1, 'publisher_id': 1, 'pages': 447, 'mean_age': 34.5}] # Calling annotate() on a ValuesQuerySet annotates over the groups of # fields to be selected by the ValuesQuerySet. @@ -231,7 +232,7 @@ u'The Definitive Guide to Django: Web Development Done Right' >>> len(authors) 9 >>> sorted([(a.name, a.friends__age__avg) for a in authors]) -[(u'Adrian Holovaty', 32.0), (u'Brad Dayley', None), (u'Jacob Kaplan-Moss', 29.5), (u'James Bennett', 34.0), (u'Jeffrey Forcier ', 27.0), (u'Paul Bissex', 31.0), (u'Peter Norvig', 46.0), (u'Stuart Russell', 57.0), (u'Wesley J. Chun', 33.6...)] +[(u'Adrian Holovaty', 32.0), (u'Brad Dayley', None), (u'Jacob Kaplan-Moss', 29.5), (u'James Bennett', 34.0), (u'Jeffrey Forcier', 27.0), (u'Paul Bissex', 31.0), (u'Peter Norvig', 46.0), (u'Stuart Russell', 57.0), (u'Wesley J. Chun', 33.6...)] # The Count aggregation function allows an extra parameter: distinct. @@ -268,9 +269,9 @@ True # Lets add a publisher to test the different possibilities for filtering >>> p = Publisher(name='Expensive Publisher', num_awards=0) >>> p.save() ->>> Book(name='ExpensiveBook1', pages=1, isbn='111', rating=3.5, price=Decimal("1000"), publisher=p, pubdate=date(2008,12,1)).save() ->>> Book(name='ExpensiveBook2', pages=1, isbn='222', rating=4.0, price=Decimal("1000"), publisher=p, pubdate=date(2008,12,2)).save() ->>> Book(name='ExpensiveBook3', pages=1, isbn='333', rating=4.5, price=Decimal("35"), publisher=p, pubdate=date(2008,12,3)).save() +>>> Book(name='ExpensiveBook1', pages=1, isbn='111', rating=3.5, price=Decimal("1000"), publisher=p, contact_id=1, pubdate=date(2008,12,1)).save() +>>> Book(name='ExpensiveBook2', pages=1, isbn='222', rating=4.0, price=Decimal("1000"), publisher=p, contact_id=1, pubdate=date(2008,12,2)).save() +>>> Book(name='ExpensiveBook3', pages=1, isbn='333', rating=4.5, price=Decimal("35"), publisher=p, contact_id=1, pubdate=date(2008,12,3)).save() # Publishers that have: |
