summaryrefslogtreecommitdiff
path: root/parts/django/tests/modeltests/m2o_recursive
diff options
context:
space:
mode:
Diffstat (limited to 'parts/django/tests/modeltests/m2o_recursive')
-rw-r--r--parts/django/tests/modeltests/m2o_recursive/__init__.py0
-rw-r--r--parts/django/tests/modeltests/m2o_recursive/models.py28
-rw-r--r--parts/django/tests/modeltests/m2o_recursive/tests.py38
3 files changed, 66 insertions, 0 deletions
diff --git a/parts/django/tests/modeltests/m2o_recursive/__init__.py b/parts/django/tests/modeltests/m2o_recursive/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/parts/django/tests/modeltests/m2o_recursive/__init__.py
diff --git a/parts/django/tests/modeltests/m2o_recursive/models.py b/parts/django/tests/modeltests/m2o_recursive/models.py
new file mode 100644
index 0000000..ed9945a
--- /dev/null
+++ b/parts/django/tests/modeltests/m2o_recursive/models.py
@@ -0,0 +1,28 @@
+"""
+11. Relating an object to itself, many-to-one
+
+To define a many-to-one relationship between a model and itself, use
+``ForeignKey('self')``.
+
+In this example, a ``Category`` is related to itself. That is, each
+``Category`` has a parent ``Category``.
+
+Set ``related_name`` to designate what the reverse relationship is called.
+"""
+
+from django.db import models
+
+class Category(models.Model):
+ name = models.CharField(max_length=20)
+ parent = models.ForeignKey('self', blank=True, null=True, related_name='child_set')
+
+ def __unicode__(self):
+ return self.name
+
+class Person(models.Model):
+ full_name = models.CharField(max_length=20)
+ mother = models.ForeignKey('self', null=True, related_name='mothers_child_set')
+ father = models.ForeignKey('self', null=True, related_name='fathers_child_set')
+
+ def __unicode__(self):
+ return self.full_name
diff --git a/parts/django/tests/modeltests/m2o_recursive/tests.py b/parts/django/tests/modeltests/m2o_recursive/tests.py
new file mode 100644
index 0000000..79dde8b
--- /dev/null
+++ b/parts/django/tests/modeltests/m2o_recursive/tests.py
@@ -0,0 +1,38 @@
+from django.test import TestCase
+from models import Category, Person
+
+class ManyToOneRecursiveTests(TestCase):
+
+ def setUp(self):
+ self.r = Category(id=None, name='Root category', parent=None)
+ self.r.save()
+ self.c = Category(id=None, name='Child category', parent=self.r)
+ self.c.save()
+
+ def test_m2o_recursive(self):
+ self.assertQuerysetEqual(self.r.child_set.all(),
+ ['<Category: Child category>'])
+ self.assertEqual(self.r.child_set.get(name__startswith='Child').id, self.c.id)
+ self.assertEqual(self.r.parent, None)
+ self.assertQuerysetEqual(self.c.child_set.all(), [])
+ self.assertEqual(self.c.parent.id, self.r.id)
+
+class MultipleManyToOneRecursiveTests(TestCase):
+
+ def setUp(self):
+ self.dad = Person(full_name='John Smith Senior', mother=None, father=None)
+ self.dad.save()
+ self.mom = Person(full_name='Jane Smith', mother=None, father=None)
+ self.mom.save()
+ self.kid = Person(full_name='John Smith Junior', mother=self.mom, father=self.dad)
+ self.kid.save()
+
+ def test_m2o_recursive2(self):
+ self.assertEqual(self.kid.mother.id, self.mom.id)
+ self.assertEqual(self.kid.father.id, self.dad.id)
+ self.assertQuerysetEqual(self.dad.fathers_child_set.all(),
+ ['<Person: John Smith Junior>'])
+ self.assertQuerysetEqual(self.mom.mothers_child_set.all(),
+ ['<Person: John Smith Junior>'])
+ self.assertQuerysetEqual(self.kid.mothers_child_set.all(), [])
+ self.assertQuerysetEqual(self.kid.fathers_child_set.all(), [])