summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorRussell Keith-Magee <russell@keith-magee.com>2010-10-28 13:00:08 +0000
committerRussell Keith-Magee <russell@keith-magee.com>2010-10-28 13:00:08 +0000
commit29ea1bef215040d34fb0f03c7f39f3a82515febf (patch)
tree68ad531c822b62946ca5ac99f1c8c87a20ffe192 /tests
parent3a679cc1c458c4e31fc22e511e9bc51ed939f102 (diff)
[1.2.X] Fixed #14471 -- Corrected a regression in the use of methods on custom managers on related querysets. Thanks to Lucky for the report.
Backport of r14389 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@14390 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests')
-rw-r--r--tests/regressiontests/multiple_database/models.py15
-rw-r--r--tests/regressiontests/multiple_database/tests.py22
2 files changed, 36 insertions, 1 deletions
diff --git a/tests/regressiontests/multiple_database/models.py b/tests/regressiontests/multiple_database/models.py
index e0be761ca0..ce71828700 100644
--- a/tests/regressiontests/multiple_database/models.py
+++ b/tests/regressiontests/multiple_database/models.py
@@ -30,7 +30,21 @@ class Person(models.Model):
class Meta:
ordering = ('name',)
+# This book manager doesn't do anything interesting; it just
+# exists to strip out the 'extra_arg' argument to certain
+# calls. This argument is used to establish that the BookManager
+# is actually getting used when it should be.
+class BookManager(models.Manager):
+ def create(self, *args, **kwargs):
+ kwargs.pop('extra_arg', None)
+ return super(BookManager, self).create(*args, **kwargs)
+
+ def get_or_create(self, *args, **kwargs):
+ kwargs.pop('extra_arg', None)
+ return super(BookManager, self).get_or_create(*args, **kwargs)
+
class Book(models.Model):
+ objects = BookManager()
title = models.CharField(max_length=100)
published = models.DateField()
authors = models.ManyToManyField(Person)
@@ -60,4 +74,3 @@ class UserProfile(models.Model):
class Meta:
ordering = ('flavor',)
-
diff --git a/tests/regressiontests/multiple_database/tests.py b/tests/regressiontests/multiple_database/tests.py
index f27d8b5a28..484cac6ada 100644
--- a/tests/regressiontests/multiple_database/tests.py
+++ b/tests/regressiontests/multiple_database/tests.py
@@ -890,6 +890,28 @@ class QueryTestCase(TestCase):
except ValueError:
pass
+ def test_related_manager(self):
+ "Related managers return managers, not querysets"
+ mark = Person.objects.using('other').create(name="Mark Pilgrim")
+
+ # extra_arg is removed by the BookManager's implementation of
+ # create(); but the BookManager's implementation won't get called
+ # unless edited returns a Manager, not a queryset
+ mark.book_set.create(title="Dive into Python",
+ published=datetime.date(2009, 5, 4),
+ extra_arg=True)
+
+ mark.book_set.get_or_create(title="Dive into Python",
+ published=datetime.date(2009, 5, 4),
+ extra_arg=True)
+
+ mark.edited.create(title="Dive into Water",
+ published=datetime.date(2009, 5, 4),
+ extra_arg=True)
+
+ mark.edited.get_or_create(title="Dive into Water",
+ published=datetime.date(2009, 5, 4),
+ extra_arg=True)
class TestRouter(object):
# A test router. The behaviour is vaguely master/slave, but the