summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoulder Sprinters <boulder-sprinters@djangoproject.com>2007-05-21 21:37:52 +0000
committerBoulder Sprinters <boulder-sprinters@djangoproject.com>2007-05-21 21:37:52 +0000
commit12b5df62dd8670c9dae2f77c7f7312e558a65104 (patch)
tree8792964be3dc28966df141e61618e5d135a6b0fb
parent97ccb9304ef578057640645013f5fb7eeafa246f (diff)
downloaddjango-12b5df62dd8670c9dae2f77c7f7312e558a65104.tar.gz
boulder-oracle-sprint: Made Oracle return DecimalField values as decimal objects.
git-svn-id: http://code.djangoproject.com/svn/django/branches/boulder-oracle-sprint@5309 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/db/backends/oracle/base.py5
-rw-r--r--django/db/models/base.py15
2 files changed, 12 insertions, 8 deletions
diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py
index d2957ccd7a..ff1dc0d299 100644
--- a/django/db/backends/oracle/base.py
+++ b/django/db/backends/oracle/base.py
@@ -461,7 +461,7 @@ def get_query_set_class(DefaultQuerySet):
def resolve_columns(self, row, fields=()):
from django.db.models.fields import DateField, DateTimeField, \
- TimeField, BooleanField, NullBooleanField
+ TimeField, BooleanField, NullBooleanField, DecimalField
values = []
for value, field in map(None, row, fields):
if isinstance(value, Database.LOB):
@@ -475,6 +475,9 @@ def get_query_set_class(DefaultQuerySet):
# Convert 1 or 0 to True or False
elif value in (1, 0) and isinstance(field, (BooleanField, NullBooleanField)):
value = bool(value)
+ # Convert floats to decimals
+ elif value is not None and isinstance(field, DecimalField):
+ value = util.typecast_decimal(field.format_number(value))
# cx_Oracle always returns datetime.datetime objects for
# DATE and TIMESTAMP columns, but Django wants to see a
# python datetime.date, .time, or .datetime. We use the type
diff --git a/django/db/models/base.py b/django/db/models/base.py
index a567f0ed37..b1c4a43628 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -96,9 +96,9 @@ class Model(object):
def __init__(self, *args, **kwargs):
dispatcher.send(signal=signals.pre_init, sender=self.__class__, args=args, kwargs=kwargs)
-
+
# There is a rather weird disparity here; if kwargs, it's set, then args
- # overrides it. It should be one or the other; don't duplicate the work
+ # overrides it. It should be one or the other; don't duplicate the work
# The reason for the kwargs check is that standard iterator passes in by
# args, and nstantiation for iteration is 33% faster.
args_len = len(args)
@@ -122,10 +122,10 @@ class Model(object):
# Maintain compatibility with existing calls.
if isinstance(field.rel, ManyToOneRel):
kwargs.pop(field.attname, None)
-
+
# Now we're left with the unprocessed fields that *must* come from
# keywords, or default.
-
+
for field in fields_iter:
if kwargs:
if isinstance(field.rel, ManyToOneRel):
@@ -147,7 +147,7 @@ class Model(object):
try:
val = getattr(rel_obj, field.rel.get_related_field().attname)
except AttributeError:
- raise TypeError("Invalid value: %r should be a %s instance, not a %s" %
+ raise TypeError("Invalid value: %r should be a %s instance, not a %s" %
(field.name, field.rel.to, type(rel_obj)))
else:
val = kwargs.pop(field.attname, field.get_default())
@@ -211,7 +211,8 @@ class Model(object):
if pk_set:
# Determine whether a record with the primary key already exists.
cursor.execute("SELECT COUNT(*) FROM %s WHERE %s=%%s" % \
- (backend.quote_name(self._meta.db_table), backend.quote_name(self._meta.pk.column)), [pk_val])
+ (backend.quote_name(self._meta.db_table), backend.quote_name(self._meta.pk.column)),
+ self._meta.pk.get_db_prep_lookup('exact', pk_val))
# If it does already exist, do an UPDATE.
if cursor.fetchone()[0] > 0:
db_values = [f.get_db_prep_save(f.pre_save(self, False)) for f in non_pks]
@@ -220,7 +221,7 @@ class Model(object):
(backend.quote_name(self._meta.db_table),
','.join(['%s=%%s' % backend.quote_name(f.column) for f in non_pks]),
backend.quote_name(self._meta.pk.column)),
- db_values + [pk_val])
+ db_values + self._meta.pk.get_db_prep_lookup('exact', pk_val))
else:
record_exists = False
if not pk_set or not record_exists: