mirror of
https://github.com/django/django.git
synced 2025-07-04 01:39:20 +00:00
unicode: Merged from trunk up to [5398].
git-svn-id: http://code.djangoproject.com/svn/django/branches/unicode@5399 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
797c1d2a85
commit
7a30b4e03a
@ -555,9 +555,8 @@ class QuerySet(object):
|
|||||||
class ValuesQuerySet(QuerySet):
|
class ValuesQuerySet(QuerySet):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(ValuesQuerySet, self).__init__(*args, **kwargs)
|
super(ValuesQuerySet, self).__init__(*args, **kwargs)
|
||||||
# select_related and select aren't supported in values().
|
# select_related isn't supported in values().
|
||||||
self._select_related = False
|
self._select_related = False
|
||||||
self._select = {}
|
|
||||||
|
|
||||||
def iterator(self):
|
def iterator(self):
|
||||||
try:
|
try:
|
||||||
@ -567,13 +566,28 @@ class ValuesQuerySet(QuerySet):
|
|||||||
|
|
||||||
# self._fields is a list of field names to fetch.
|
# self._fields is a list of field names to fetch.
|
||||||
if self._fields:
|
if self._fields:
|
||||||
columns = [self.model._meta.get_field(f, many_to_many=False).column for f in self._fields]
|
#columns = [self.model._meta.get_field(f, many_to_many=False).column for f in self._fields]
|
||||||
|
if not self._select:
|
||||||
|
columns = [self.model._meta.get_field(f, many_to_many=False).column for f in self._fields]
|
||||||
|
else:
|
||||||
|
columns = []
|
||||||
|
for f in self._fields:
|
||||||
|
if f in [field.name for field in self.model._meta.fields]:
|
||||||
|
columns.append( self.model._meta.get_field(f, many_to_many=False).column )
|
||||||
|
elif not self._select.has_key( f ):
|
||||||
|
raise FieldDoesNotExist, '%s has no field named %r' % ( self.model._meta.object_name, f )
|
||||||
|
|
||||||
field_names = self._fields
|
field_names = self._fields
|
||||||
else: # Default to all fields.
|
else: # Default to all fields.
|
||||||
columns = [f.column for f in self.model._meta.fields]
|
columns = [f.column for f in self.model._meta.fields]
|
||||||
field_names = [f.attname for f in self.model._meta.fields]
|
field_names = [f.attname for f in self.model._meta.fields]
|
||||||
|
|
||||||
select = ['%s.%s' % (backend.quote_name(self.model._meta.db_table), backend.quote_name(c)) for c in columns]
|
select = ['%s.%s' % (backend.quote_name(self.model._meta.db_table), backend.quote_name(c)) for c in columns]
|
||||||
|
|
||||||
|
# Add any additional SELECTs.
|
||||||
|
if self._select:
|
||||||
|
select.extend(['(%s) AS %s' % (quote_only_if_word(s[1]), backend.quote_name(s[0])) for s in self._select.items()])
|
||||||
|
|
||||||
cursor = connection.cursor()
|
cursor = connection.cursor()
|
||||||
cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params)
|
cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params)
|
||||||
while 1:
|
while 1:
|
||||||
|
@ -792,7 +792,7 @@ class DecimalField(TextField):
|
|||||||
try:
|
try:
|
||||||
import decimal
|
import decimal
|
||||||
except ImportError:
|
except ImportError:
|
||||||
from django.utils import decimal
|
from django.utils import _decimal as decimal
|
||||||
try:
|
try:
|
||||||
return decimal.Decimal(data)
|
return decimal.Decimal(data)
|
||||||
except decimal.InvalidOperation, e:
|
except decimal.InvalidOperation, e:
|
||||||
|
@ -238,7 +238,7 @@ class RegroupNode(Node):
|
|||||||
return ''
|
return ''
|
||||||
output = [] # list of dictionaries in the format {'grouper': 'key', 'list': [list of contents]}
|
output = [] # list of dictionaries in the format {'grouper': 'key', 'list': [list of contents]}
|
||||||
for obj in obj_list:
|
for obj in obj_list:
|
||||||
grouper = self.expression.resolve(Context({'var': obj}), True)
|
grouper = self.expression.resolve(obj, True)
|
||||||
# TODO: Is this a sensible way to determine equality?
|
# TODO: Is this a sensible way to determine equality?
|
||||||
if output and repr(output[-1]['grouper']) == repr(grouper):
|
if output and repr(output[-1]['grouper']) == repr(grouper):
|
||||||
output[-1]['list'].append(obj)
|
output[-1]['list'].append(obj)
|
||||||
@ -848,7 +848,7 @@ def regroup(parser, token):
|
|||||||
if lastbits_reversed[1][::-1] != 'as':
|
if lastbits_reversed[1][::-1] != 'as':
|
||||||
raise TemplateSyntaxError, "next-to-last argument to 'regroup' tag must be 'as'"
|
raise TemplateSyntaxError, "next-to-last argument to 'regroup' tag must be 'as'"
|
||||||
|
|
||||||
expression = parser.compile_filter('var.%s' % lastbits_reversed[2][::-1])
|
expression = parser.compile_filter(lastbits_reversed[2][::-1])
|
||||||
|
|
||||||
var_name = lastbits_reversed[0][::-1]
|
var_name = lastbits_reversed[0][::-1]
|
||||||
return RegroupNode(target, expression, var_name)
|
return RegroupNode(target, expression, var_name)
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
# This is a slightly modified version of the doctest.py that shipped with Python 2.4
|
||||||
|
# It incorporates changes that have been submitted the the Python ticket tracker
|
||||||
|
# as ticket #1521051. These changes allow for a DoctestRunner and Doctest base
|
||||||
|
# class to be specified when constructing a DoctestSuite.
|
||||||
|
|
||||||
# Module doctest.
|
# Module doctest.
|
||||||
# Released to the public domain 16-Jan-2001, by Tim Peters (tim@python.org).
|
# Released to the public domain 16-Jan-2001, by Tim Peters (tim@python.org).
|
||||||
# Major enhancements and refactoring by:
|
# Major enhancements and refactoring by:
|
@ -1,5 +1,6 @@
|
|||||||
import unittest, doctest
|
import unittest
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
from django.test import _doctest as doctest
|
||||||
from django.test.utils import setup_test_environment, teardown_test_environment
|
from django.test.utils import setup_test_environment, teardown_test_environment
|
||||||
from django.test.utils import create_test_db, destroy_test_db
|
from django.test.utils import create_test_db, destroy_test_db
|
||||||
from django.test.testcases import OutputChecker, DocTestRunner
|
from django.test.testcases import OutputChecker, DocTestRunner
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
import re, doctest, unittest
|
import re, unittest
|
||||||
from urlparse import urlparse
|
from urlparse import urlparse
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from django.core import management, mail
|
from django.core import management, mail
|
||||||
from django.db.models import get_apps
|
from django.db.models import get_apps
|
||||||
|
from django.test import _doctest as doctest
|
||||||
from django.test.client import Client
|
from django.test.client import Client
|
||||||
|
|
||||||
normalize_long_ints = lambda s: re.sub(r'(?<![\w])(\d+)L(?![\w])', '\\1', s)
|
normalize_long_ints = lambda s: re.sub(r'(?<![\w])(\d+)L(?![\w])', '\\1', s)
|
||||||
|
@ -147,7 +147,7 @@ doctests or unit tests are right for you.
|
|||||||
If you've been using Python for a while, ``doctest`` will probably feel more
|
If you've been using Python for a while, ``doctest`` will probably feel more
|
||||||
"pythonic". It's designed to make writing tests as easy as possible, so
|
"pythonic". It's designed to make writing tests as easy as possible, so
|
||||||
there's no overhead of writing classes or methods; you simply put tests in
|
there's no overhead of writing classes or methods; you simply put tests in
|
||||||
docstrings. This gives the added advantage of given your modules automatic
|
docstrings. This gives the added advantage of giving your modules automatic
|
||||||
documentation -- well-written doctests can kill both the documentation and the
|
documentation -- well-written doctests can kill both the documentation and the
|
||||||
testing bird with a single stone.
|
testing bird with a single stone.
|
||||||
|
|
||||||
@ -579,7 +579,7 @@ control the particular collation used by the test database with the
|
|||||||
``TEST_DATABASE_COLLATION`` setting. Refer to the settings_ documentation for
|
``TEST_DATABASE_COLLATION`` setting. Refer to the settings_ documentation for
|
||||||
details of these advanced settings.
|
details of these advanced settings.
|
||||||
|
|
||||||
.. _settings: ../settings.txt
|
.. _settings: ../settings/
|
||||||
|
|
||||||
The test database is created by the user in the ``DATABASE_USER`` setting.
|
The test database is created by the user in the ``DATABASE_USER`` setting.
|
||||||
This user needs to have sufficient privileges to create a new database on the
|
This user needs to have sufficient privileges to create a new database on the
|
||||||
|
@ -131,6 +131,27 @@ True
|
|||||||
[('headline', u'Article 7'), ('id', 7)]
|
[('headline', u'Article 7'), ('id', 7)]
|
||||||
[('headline', u'Article 1'), ('id', 1)]
|
[('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'):
|
||||||
|
... i = d.items()
|
||||||
|
... i.sort()
|
||||||
|
... i
|
||||||
|
[('id', 5), ('id_plus_one', 6)]
|
||||||
|
[('id', 6), ('id_plus_one', 7)]
|
||||||
|
[('id', 4), ('id_plus_one', 5)]
|
||||||
|
[('id', 2), ('id_plus_one', 3)]
|
||||||
|
[('id', 3), ('id_plus_one', 4)]
|
||||||
|
[('id', 7), ('id_plus_one', 8)]
|
||||||
|
[('id', 1), ('id_plus_one', 2)]
|
||||||
|
|
||||||
|
# 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')
|
||||||
|
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 which fields, all are returned
|
||||||
>>> list(Article.objects.filter(id=5).values()) == [{'id': 5, 'headline': 'Article 5', 'pub_date': datetime(2005, 8, 1, 9, 0)}]
|
>>> list(Article.objects.filter(id=5).values()) == [{'id': 5, 'headline': 'Article 5', 'pub_date': datetime(2005, 8, 1, 9, 0)}]
|
||||||
True
|
True
|
||||||
|
Loading…
x
Reference in New Issue
Block a user