mirror of
https://github.com/django/django.git
synced 2025-07-04 09:49:12 +00:00
boulder-oracle-sprint: Fixed #4093 and added tests that cover it and the tricky datetime
fields. git-svn-id: http://code.djangoproject.com/svn/django/branches/boulder-oracle-sprint@5046 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
557a0d407c
commit
4230f0c936
@ -454,7 +454,8 @@ def get_query_set_class(DefaultQuerySet):
|
|||||||
return select, " ".join(sql), params
|
return select, " ".join(sql), params
|
||||||
|
|
||||||
def resolve_columns(self, row, fields=()):
|
def resolve_columns(self, row, fields=()):
|
||||||
from django.db.models.fields import DateField, DateTimeField, TimeField
|
from django.db.models.fields import DateField, DateTimeField, \
|
||||||
|
TimeField, BooleanField, NullBooleanField
|
||||||
values = []
|
values = []
|
||||||
for value, field in map(None, row, fields):
|
for value, field in map(None, row, fields):
|
||||||
if isinstance(value, Database.LOB):
|
if isinstance(value, Database.LOB):
|
||||||
@ -464,6 +465,9 @@ def get_query_set_class(DefaultQuerySet):
|
|||||||
# where we undo that treachery.
|
# where we undo that treachery.
|
||||||
if value == ' ':
|
if value == ' ':
|
||||||
value = ''
|
value = ''
|
||||||
|
# Convert 1 or 0 to True or False
|
||||||
|
elif value in (1, 0) and isinstance(field, (BooleanField, NullBooleanField)):
|
||||||
|
value = bool(value)
|
||||||
# cx_Oracle always returns datetime.datetime objects for
|
# cx_Oracle always returns datetime.datetime objects for
|
||||||
# DATE and TIMESTAMP columns, but Django wants to see a
|
# DATE and TIMESTAMP columns, but Django wants to see a
|
||||||
# python datetime.date, .time, or .datetime. We use the type
|
# python datetime.date, .time, or .datetime. We use the type
|
||||||
|
@ -537,6 +537,7 @@ class DateTimeField(DateField):
|
|||||||
# neither database supports microseconds.
|
# neither database supports microseconds.
|
||||||
if settings.DATABASE_ENGINE in ('mysql', 'oracle') and hasattr(value, 'microsecond'):
|
if settings.DATABASE_ENGINE in ('mysql', 'oracle') and hasattr(value, 'microsecond'):
|
||||||
value = value.replace(microsecond=0)
|
value = value.replace(microsecond=0)
|
||||||
|
value = str(value)
|
||||||
return Field.get_db_prep_save(self, value)
|
return Field.get_db_prep_save(self, value)
|
||||||
|
|
||||||
def get_db_prep_lookup(self, lookup_type, value):
|
def get_db_prep_lookup(self, lookup_type, value):
|
||||||
|
0
tests/modeltests/datatypes/__init__.py
Normal file
0
tests/modeltests/datatypes/__init__.py
Normal file
60
tests/modeltests/datatypes/models.py
Normal file
60
tests/modeltests/datatypes/models.py
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
"""
|
||||||
|
1. Simple data types testing.
|
||||||
|
|
||||||
|
This is a basic model to test saving and loading boolean and date-related
|
||||||
|
types, which in the past were problematic for some database backends.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
class Donut(models.Model):
|
||||||
|
name = models.CharField(maxlength=100)
|
||||||
|
is_frosted = models.BooleanField(default=False)
|
||||||
|
has_sprinkles = models.NullBooleanField()
|
||||||
|
baked_date = models.DateField(null=True)
|
||||||
|
baked_time = models.TimeField(null=True)
|
||||||
|
consumed_at = models.DateTimeField(null=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
ordering = ('consumed_at',)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
__test__ = {'API_TESTS': """
|
||||||
|
# No donuts are in the system yet.
|
||||||
|
>>> Donut.objects.all()
|
||||||
|
[]
|
||||||
|
|
||||||
|
>>> d = Donut(name='Apple Fritter')
|
||||||
|
|
||||||
|
# Ensure we're getting True and False, not 0 and 1
|
||||||
|
>>> d.is_frosted
|
||||||
|
False
|
||||||
|
>>> d.has_sprinkles
|
||||||
|
>>> d.has_sprinkles = True
|
||||||
|
>>> d.has_sprinkles
|
||||||
|
True
|
||||||
|
>>> d.save()
|
||||||
|
>>> d2 = Donut.objects.all()[0]
|
||||||
|
>>> d2
|
||||||
|
<Donut: Apple Fritter>
|
||||||
|
>>> d2.is_frosted
|
||||||
|
False
|
||||||
|
>>> d2.has_sprinkles
|
||||||
|
True
|
||||||
|
|
||||||
|
>>> import datetime
|
||||||
|
>>> d2.baked_date = datetime.date(year=1938, month=6, day=4)
|
||||||
|
>>> d2.baked_time = datetime.time(hour=5, minute=30)
|
||||||
|
>>> d2.consumed_at = datetime.datetime(year=2007, month=4, day=20, hour=16, minute=19, second=59)
|
||||||
|
>>> d2.save()
|
||||||
|
|
||||||
|
>>> d3 = Donut.objects.all()[0]
|
||||||
|
>>> d3.baked_date
|
||||||
|
datetime.date(1938, 6, 4)
|
||||||
|
>>> d3.baked_time
|
||||||
|
datetime.time(5, 30)
|
||||||
|
>>> d3.consumed_at
|
||||||
|
datetime.datetime(2007, 4, 20, 16, 19, 59)
|
||||||
|
"""}
|
Loading…
x
Reference in New Issue
Block a user