summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorCarl Meyer <carl@oddbird.net>2011-01-25 03:39:38 +0000
committerCarl Meyer <carl@oddbird.net>2011-01-25 03:39:38 +0000
commit131d83b9cdd6d287aa04345c78993c66c0300422 (patch)
tree9a93fd5b59be21a8f038447aa616f2bac33cafd4 /tests
parentf01e1cd42561263eb9f1130ebcb39ffa6eecbe63 (diff)
[1.2.X] Fixed #11319 - Added lookup support for ForeignKey.to_field. Also reverted no-longer-needed model formsets workaround for lack of such support from r10756. Thanks Russell and Alex for review.
Backport of r15303 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@15304 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests')
-rw-r--r--tests/modeltests/custom_pk/tests.py8
-rw-r--r--tests/regressiontests/queries/models.py20
-rw-r--r--tests/regressiontests/queries/tests.py63
3 files changed, 85 insertions, 6 deletions
diff --git a/tests/modeltests/custom_pk/tests.py b/tests/modeltests/custom_pk/tests.py
index 6ef4bdd433..9ab54d774d 100644
--- a/tests/modeltests/custom_pk/tests.py
+++ b/tests/modeltests/custom_pk/tests.py
@@ -158,11 +158,9 @@ class CustomPKTests(TestCase):
new_bar = Bar.objects.create()
new_foo = Foo.objects.create(bar=new_bar)
- # FIXME: This still doesn't work, but will require some changes in
- # get_db_prep_lookup to fix it.
- # f = Foo.objects.get(bar=new_bar.pk)
- # self.assertEqual(f, new_foo)
- # self.assertEqual(f.bar, new_bar)
+ f = Foo.objects.get(bar=new_bar.pk)
+ self.assertEqual(f, new_foo)
+ self.assertEqual(f.bar, new_bar)
f = Foo.objects.get(bar=new_bar)
self.assertEqual(f, new_foo),
diff --git a/tests/regressiontests/queries/models.py b/tests/regressiontests/queries/models.py
index 5247ef90ce..3b7a08aba2 100644
--- a/tests/regressiontests/queries/models.py
+++ b/tests/regressiontests/queries/models.py
@@ -274,3 +274,23 @@ class Plaything(models.Model):
class Article(models.Model):
name = models.CharField(max_length=20)
created = models.DateTimeField()
+
+class Food(models.Model):
+ name = models.CharField(max_length=20, unique=True)
+
+ def __unicode__(self):
+ return self.name
+
+class Eaten(models.Model):
+ food = models.ForeignKey(Food, to_field="name")
+ meal = models.CharField(max_length=20)
+
+ def __unicode__(self):
+ return u"%s at %s" % (self.food, self.meal)
+
+class Node(models.Model):
+ num = models.IntegerField(unique=True)
+ parent = models.ForeignKey("self", to_field="num", null=True)
+
+ def __unicode__(self):
+ return u"%s" % self.num
diff --git a/tests/regressiontests/queries/tests.py b/tests/regressiontests/queries/tests.py
index 78d6db7d59..a37d4fae11 100644
--- a/tests/regressiontests/queries/tests.py
+++ b/tests/regressiontests/queries/tests.py
@@ -14,7 +14,7 @@ from django.utils.datastructures import SortedDict
from models import (Annotation, Article, Author, Celebrity, Child, Cover, Detail,
DumbCategory, ExtraInfo, Fan, Item, LeafA, LoopX, LoopZ, ManagedModel,
Member, NamedCategory, Note, Number, Plaything, PointerA, Ranking, Related,
- Report, ReservedName, Tag, TvChef, Valid, X)
+ Report, ReservedName, Tag, TvChef, Valid, X, Food, Eaten, Node)
class BaseQuerysetTest(TestCase):
@@ -1506,6 +1506,67 @@ class EscapingTests(TestCase):
)
+class ToFieldTests(TestCase):
+ def test_in_query(self):
+ apple = Food.objects.create(name="apple")
+ pear = Food.objects.create(name="pear")
+ lunch = Eaten.objects.create(food=apple, meal="lunch")
+ dinner = Eaten.objects.create(food=pear, meal="dinner")
+
+ self.assertEqual(
+ set(Eaten.objects.filter(food__in=[apple, pear])),
+ set([lunch, dinner]),
+ )
+
+ def test_reverse_in(self):
+ apple = Food.objects.create(name="apple")
+ pear = Food.objects.create(name="pear")
+ lunch_apple = Eaten.objects.create(food=apple, meal="lunch")
+ lunch_pear = Eaten.objects.create(food=pear, meal="dinner")
+
+ self.assertEqual(
+ set(Food.objects.filter(eaten__in=[lunch_apple, lunch_pear])),
+ set([apple, pear])
+ )
+
+ def test_single_object(self):
+ apple = Food.objects.create(name="apple")
+ lunch = Eaten.objects.create(food=apple, meal="lunch")
+ dinner = Eaten.objects.create(food=apple, meal="dinner")
+
+ self.assertEqual(
+ set(Eaten.objects.filter(food=apple)),
+ set([lunch, dinner])
+ )
+
+ def test_single_object_reverse(self):
+ apple = Food.objects.create(name="apple")
+ lunch = Eaten.objects.create(food=apple, meal="lunch")
+
+ self.assertEqual(
+ set(Food.objects.filter(eaten=lunch)),
+ set([apple])
+ )
+
+ def test_recursive_fk(self):
+ node1 = Node.objects.create(num=42)
+ node2 = Node.objects.create(num=1, parent=node1)
+
+ self.assertEqual(
+ list(Node.objects.filter(parent=node1)),
+ [node2]
+ )
+
+ def test_recursive_fk_reverse(self):
+ node1 = Node.objects.create(num=42)
+ node2 = Node.objects.create(num=1, parent=node1)
+
+ self.assertEqual(
+ list(Node.objects.filter(node=node2)),
+ [node1]
+ )
+
+
# In Python 2.6 beta releases, exceptions raised in __len__ are swallowed
# (Python issue 1242657), so these cases return an empty list, rather than
# raising an exception. Not a lot we can do about that, unfortunately, due to