From 8831f3ee2c7541de2263d90350d1642ef2c5ede4 Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Fri, 27 Jul 2007 21:53:02 +0000 Subject: [PATCH] Added unit test that confirms a bug in ValuesQuerySets that have extra(select) specified. If the select dictionary has several fields, Django assigns the wrong values to the select-field names git-svn-id: http://code.djangoproject.com/svn/django/trunk@5767 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- tests/modeltests/lookup/models.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/tests/modeltests/lookup/models.py b/tests/modeltests/lookup/models.py index 207b27a7d9..63e45cfb4c 100644 --- a/tests/modeltests/lookup/models.py +++ b/tests/modeltests/lookup/models.py @@ -132,9 +132,8 @@ True [('headline', u'Article 7'), ('id', 7)] [('headline', u'Article 1'), ('id', 1)] - -# you can use values() even on extra fields ->>> for d in Article.objects.extra( select={'id_plus_one' : 'id + 1'} ).values('id', 'id_plus_one'): +# The values() method works with "extra" fields specified in extra(select). +>>> for d in Article.objects.extra(select={'id_plus_one': 'id + 1'}).values('id', 'id_plus_one'): ... i = d.items() ... i.sort() ... i @@ -145,15 +144,24 @@ True [('id', 3), ('id_plus_one', 4)] [('id', 7), ('id_plus_one', 8)] [('id', 1), ('id_plus_one', 2)] +>>> data = {'id_plus_one': 'id+1', 'id_plus_two': 'id+2', 'id_plus_three': 'id+3', +... 'id_plus_four': 'id+4', 'id_plus_five': 'id+5', 'id_plus_six': 'id+6', +... 'id_plus_seven': 'id+7', 'id_plus_eight': 'id+8'} +>>> result = list(Article.objects.filter(id=1).extra(select=data).values(*data.keys()))[0] +>>> result = result.items() +>>> result.sort() +>>> result +[('id_plus_eight', 9), ('id_plus_five', 6), ('id_plus_four', 5), ('id_plus_one', 2), ('id_plus_seven', 8), ('id_plus_six', 7), ('id_plus_three', 4), ('id_plus_two', 3)] -# however, an exception FieldDoesNotExist will still be thrown -# if you try to access non-existent field (field that is neither on the model nor extra) ->>> Article.objects.extra( select={'id_plus_one' : 'id + 1'} ).values('id', 'id_plus_two') +# However, an exception FieldDoesNotExist will be thrown if you specify a +# non-existent field name in values() (a field that is neither in the model +# nor in extra(select)). +>>> Article.objects.extra(select={'id_plus_one': 'id + 1'}).values('id', 'id_plus_two') Traceback (most recent call last): ... FieldDoesNotExist: Article has no field named 'id_plus_two' -# if you don't specify which fields, all are returned +# If you don't specify field names to values(), all are returned. >>> list(Article.objects.filter(id=5).values()) == [{'id': 5, 'headline': 'Article 5', 'pub_date': datetime(2005, 8, 1, 9, 0)}] True