Skip to content

Commit 8831f3e

Browse files
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
1 parent 386a4c6 commit 8831f3e

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

tests/modeltests/lookup/models.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,8 @@ def __unicode__(self):
132132
[('headline', u'Article 7'), ('id', 7)]
133133
[('headline', u'Article 1'), ('id', 1)]
134134
135-
136-
# you can use values() even on extra fields
137-
>>> for d in Article.objects.extra( select={'id_plus_one' : 'id + 1'} ).values('id', 'id_plus_one'):
135+
# The values() method works with "extra" fields specified in extra(select).
136+
>>> for d in Article.objects.extra(select={'id_plus_one': 'id + 1'}).values('id', 'id_plus_one'):
138137
... i = d.items()
139138
... i.sort()
140139
... i
@@ -145,15 +144,24 @@ def __unicode__(self):
145144
[('id', 3), ('id_plus_one', 4)]
146145
[('id', 7), ('id_plus_one', 8)]
147146
[('id', 1), ('id_plus_one', 2)]
148-
149-
# however, an exception FieldDoesNotExist will still be thrown
150-
# if you try to access non-existent field (field that is neither on the model nor extra)
151-
>>> Article.objects.extra( select={'id_plus_one' : 'id + 1'} ).values('id', 'id_plus_two')
147+
>>> data = {'id_plus_one': 'id+1', 'id_plus_two': 'id+2', 'id_plus_three': 'id+3',
148+
... 'id_plus_four': 'id+4', 'id_plus_five': 'id+5', 'id_plus_six': 'id+6',
149+
... 'id_plus_seven': 'id+7', 'id_plus_eight': 'id+8'}
150+
>>> result = list(Article.objects.filter(id=1).extra(select=data).values(*data.keys()))[0]
151+
>>> result = result.items()
152+
>>> result.sort()
153+
>>> result
154+
[('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)]
155+
156+
# However, an exception FieldDoesNotExist will be thrown if you specify a
157+
# non-existent field name in values() (a field that is neither in the model
158+
# nor in extra(select)).
159+
>>> Article.objects.extra(select={'id_plus_one': 'id + 1'}).values('id', 'id_plus_two')
152160
Traceback (most recent call last):
153161
...
154162
FieldDoesNotExist: Article has no field named 'id_plus_two'
155163
156-
# if you don't specify which fields, all are returned
164+
# If you don't specify field names to values(), all are returned.
157165
>>> list(Article.objects.filter(id=5).values()) == [{'id': 5, 'headline': 'Article 5', 'pub_date': datetime(2005, 8, 1, 9, 0)}]
158166
True
159167

0 commit comments

Comments
 (0)