From d5cc16b47154e3788db5d38a39de70aef557eebb Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Mon, 1 Sep 2008 21:04:01 +0000 Subject: [PATCH] Fixed #8076: fixed `get_(next/previous)_by_date` when used with subclasses. Thanks, bjornkri and jan_oberst. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8814 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/fields/related.py | 7 +++- .../model_inheritance_regress/models.py | 37 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index 4532385a4f..ef19477c30 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -142,7 +142,12 @@ class RelatedField(object): if hasattr(value, 'as_sql'): sql, params = value.as_sql() return QueryWrapper(('(%s)' % sql), params) - if lookup_type == 'exact': + + # FIXME: lt and gt are explicitally allowed to make + # get_(next/prev)_by_date work; other lookups are not allowed since that + # gets messy pretty quick. This is a good candidate for some refactoring + # in the future. + if lookup_type in ['exact', 'gt', 'lt']: return [pk_trace(value)] if lookup_type in ('range', 'in'): return [pk_trace(v) for v in value] diff --git a/tests/regressiontests/model_inheritance_regress/models.py b/tests/regressiontests/model_inheritance_regress/models.py index 716c7f5ad8..45c516a855 100644 --- a/tests/regressiontests/model_inheritance_regress/models.py +++ b/tests/regressiontests/model_inheritance_regress/models.py @@ -59,6 +59,18 @@ class SelfRefParent(models.Model): class SelfRefChild(SelfRefParent): child_data = models.IntegerField() +class Article(models.Model): + headline = models.CharField(max_length=100) + pub_date = models.DateTimeField() + class Meta: + ordering = ('-pub_date', 'headline') + + def __unicode__(self): + return self.headline + +class ArticleWithAuthor(Article): + author = models.CharField(max_length=100) + __test__ = {'API_TESTS':""" # Regression for #7350, #7202 # Check that when you create a Parent object with a specific reference to an @@ -194,4 +206,29 @@ True >>> obj = SelfRefChild.objects.create(child_data=37, parent_data=42) >>> obj.delete() +# Regression tests for #8076 - get_(next/previous)_by_date should +>>> c1 = ArticleWithAuthor(headline='ArticleWithAuthor 1', author="Person 1", pub_date=datetime.datetime(2005, 8, 1, 3, 0)) +>>> c1.save() +>>> c2 = ArticleWithAuthor(headline='ArticleWithAuthor 2', author="Person 2", pub_date=datetime.datetime(2005, 8, 1, 10, 0)) +>>> c2.save() +>>> c3 = ArticleWithAuthor(headline='ArticleWithAuthor 3', author="Person 3", pub_date=datetime.datetime(2005, 8, 2)) +>>> c3.save() + +>>> c1.get_next_by_pub_date() + +>>> c2.get_next_by_pub_date() + +>>> c3.get_next_by_pub_date() +Traceback (most recent call last): + ... +DoesNotExist: ArticleWithAuthor matching query does not exist. +>>> c3.get_previous_by_pub_date() + +>>> c2.get_previous_by_pub_date() + +>>> c1.get_previous_by_pub_date() +Traceback (most recent call last): + ... +DoesNotExist: ArticleWithAuthor matching query does not exist. + """}