diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py index f175bc4cb7..745f9982a0 100644 --- a/django/db/backends/sqlite3/base.py +++ b/django/db/backends/sqlite3/base.py @@ -101,7 +101,7 @@ class DatabaseOperations(BaseDatabaseOperations): return [first % value, second % value] class DatabaseWrapper(BaseDatabaseWrapper): - + # SQLite requires LIKE statements to include an ESCAPE clause if the value # being escaped has a percent or underscore in it. # See http://www.sqlite.org/lang_expr.html for an explanation. @@ -124,7 +124,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): def __init__(self, *args, **kwargs): super(DatabaseWrapper, self).__init__(*args, **kwargs) - + self.features = DatabaseFeatures() self.ops = DatabaseOperations() self.client = DatabaseClient() @@ -179,6 +179,8 @@ class SQLiteCursorWrapper(Database.Cursor): return query % tuple("?" * num_params) def _sqlite_extract(lookup_type, dt): + if dt is None: + return None try: dt = util.typecast_timestamp(dt) except (ValueError, TypeError): diff --git a/tests/regressiontests/model_regress/models.py b/tests/regressiontests/model_regress/models.py index 2f2c2facd5..19d38b216c 100644 --- a/tests/regressiontests/model_regress/models.py +++ b/tests/regressiontests/model_regress/models.py @@ -27,7 +27,7 @@ class Movie(models.Model): name = models.CharField(max_length=60) class Party(models.Model): - when = models.DateField() + when = models.DateField(null=True) class Event(models.Model): when = models.DateTimeField() @@ -93,6 +93,16 @@ u'' >>> [p.when for p in Party.objects.filter(when__year='1998')] [datetime.date(1998, 12, 31)] +# Date filtering was failing with NULL date values in SQLite (regression test +# for #3501, amongst other things). +>>> _ = Party.objects.create() +>>> p = Party.objects.filter(when__month=1)[0] +>>> p.when +datetime.date(1999, 1, 1) +>>> l = Party.objects.filter(pk=p.pk).dates("when", "month") +>>> l[0].month == 1 +True + # Check that get_next_by_FIELD and get_previous_by_FIELD don't crash when we # have usecs values stored on the database #