diff --git a/django/db/backends/oracle/query.py b/django/db/backends/oracle/query.py index 8563420d7f..22ef1359a3 100644 --- a/django/db/backends/oracle/query.py +++ b/django/db/backends/oracle/query.py @@ -6,6 +6,7 @@ Derives from: django.db.models.sql.query.Query import datetime from django.db.backends import util +from django.utils.encoding import force_unicode # Cache. Maps default query class to new Oracle query class. _classes = {} @@ -55,6 +56,9 @@ def query_class(QueryClass, Database): def convert_values(self, value, field): if isinstance(value, Database.LOB): value = value.read() + if field and field.get_internal_type() == 'TextField': + value = force_unicode(value) + # Oracle stores empty strings as null. We need to undo this in # order to adhere to the Django convention of using the empty # string instead of null, but only if the field accepts the diff --git a/tests/regressiontests/datatypes/models.py b/tests/regressiontests/datatypes/models.py index 7e76d6a669..0ad809a45d 100644 --- a/tests/regressiontests/datatypes/models.py +++ b/tests/regressiontests/datatypes/models.py @@ -13,6 +13,7 @@ class Donut(models.Model): baked_date = models.DateField(null=True) baked_time = models.TimeField(null=True) consumed_at = models.DateTimeField(null=True) + review = models.TextField() class Meta: ordering = ('consumed_at',) @@ -82,6 +83,12 @@ datetime.datetime(2007, 4, 20, 16, 19, 59) >>> Donut.objects.filter(consumed_at__year=2008) [] +# Regression test for #10238: TextField values returned from the database +# should be unicode. +>>> d2 = Donut.objects.create(name=u'Jelly Donut', review=u'Outstanding') +>>> Donut.objects.get(id=d2.id).review +u'Outstanding' + """} # Regression test for #8354: the MySQL backend should raise an error if given