diff options
| author | Carl Meyer <carl@oddbird.net> | 2011-01-25 03:39:38 +0000 |
|---|---|---|
| committer | Carl Meyer <carl@oddbird.net> | 2011-01-25 03:39:38 +0000 |
| commit | 131d83b9cdd6d287aa04345c78993c66c0300422 (patch) | |
| tree | 9a93fd5b59be21a8f038447aa616f2bac33cafd4 /tests | |
| parent | f01e1cd42561263eb9f1130ebcb39ffa6eecbe63 (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.py | 8 | ||||
| -rw-r--r-- | tests/regressiontests/queries/models.py | 20 | ||||
| -rw-r--r-- | tests/regressiontests/queries/tests.py | 63 |
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 |
