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
This commit is contained in:
parent
386a4c610c
commit
8831f3ee2c
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue