From d535edb9da92f7de0c2ae35456b5b751db8e4d46 Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Mon, 25 Aug 2008 03:17:06 +0000 Subject: [PATCH] Fixed #8510 -- Allow both strings (mostly for the admin) and integers to be used in "month" and "day" filters on date/datetime fields. Without this commit, SQLite behaved inconsistently after [8494]. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8526 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/fields/__init__.py | 7 +++++++ tests/regressiontests/model_regress/models.py | 18 +++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 0d7c4edd00..dc455dcc8c 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -568,6 +568,13 @@ class DateField(Field): else: return self.editable or self.auto_now or self.auto_now_add + def get_db_prep_lookup(self, lookup_type, value): + # For "__month" and "__day" lookups, convert the value to a string so + # the database backend always sees a consistent type. + if lookup_type in ('month', 'day'): + return [force_unicode(value)] + return super(DateField, self).get_db_prep_lookup(lookup_type, value) + def get_db_prep_value(self, value): # Casts dates into the format expected by the backend return connection.ops.value_to_db_date(self.to_python(value)) diff --git a/tests/regressiontests/model_regress/models.py b/tests/regressiontests/model_regress/models.py index 9e11b43d2b..d79bbca3be 100644 --- a/tests/regressiontests/model_regress/models.py +++ b/tests/regressiontests/model_regress/models.py @@ -57,18 +57,26 @@ u'' >>> len(a4.article_text) 5000 -# #659 regression test +# Regression test for #659 >>> import datetime >>> p = Party.objects.create(when = datetime.datetime(1999, 12, 31)) >>> p = Party.objects.create(when = datetime.datetime(1998, 12, 31)) >>> p = Party.objects.create(when = datetime.datetime(1999, 1, 1)) ->>> [p.when for p in Party.objects.filter(when__month = 2)] +>>> [p.when for p in Party.objects.filter(when__month=2)] [] ->>> [p.when for p in Party.objects.filter(when__month = 1)] +>>> [p.when for p in Party.objects.filter(when__month=1)] [datetime.date(1999, 1, 1)] ->>> [p.when for p in Party.objects.filter(when__month = 12)] +>>> [p.when for p in Party.objects.filter(when__month=12)] [datetime.date(1999, 12, 31), datetime.date(1998, 12, 31)] ->>> [p.when for p in Party.objects.filter(when__year = 1998)] +>>> [p.when for p in Party.objects.filter(when__year=1998)] +[datetime.date(1998, 12, 31)] + +# Regression test for #8510 +>>> [p.when for p in Party.objects.filter(when__day='31')] +[datetime.date(1999, 12, 31), datetime.date(1998, 12, 31)] +>>> [p.when for p in Party.objects.filter(when__month='12')] +[datetime.date(1999, 12, 31), datetime.date(1998, 12, 31)] +>>> [p.when for p in Party.objects.filter(when__year='1998')] [datetime.date(1998, 12, 31)] # Check that get_next_by_FIELD and get_previous_by_FIELD don't crash when we