summaryrefslogtreecommitdiff
path: root/tests/prefetch_related/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/prefetch_related/models.py')
-rw-r--r--tests/prefetch_related/models.py197
1 files changed, 197 insertions, 0 deletions
diff --git a/tests/prefetch_related/models.py b/tests/prefetch_related/models.py
new file mode 100644
index 0000000000..e58997d200
--- /dev/null
+++ b/tests/prefetch_related/models.py
@@ -0,0 +1,197 @@
+from django.contrib.contenttypes import generic
+from django.contrib.contenttypes.models import ContentType
+from django.db import models
+from django.utils.encoding import python_2_unicode_compatible
+
+## Basic tests
+
+@python_2_unicode_compatible
+class Author(models.Model):
+ name = models.CharField(max_length=50, unique=True)
+ first_book = models.ForeignKey('Book', related_name='first_time_authors')
+ favorite_authors = models.ManyToManyField(
+ 'self', through='FavoriteAuthors', symmetrical=False, related_name='favors_me')
+
+ def __str__(self):
+ return self.name
+
+ class Meta:
+ ordering = ['id']
+
+
+class AuthorWithAge(Author):
+ author = models.OneToOneField(Author, parent_link=True)
+ age = models.IntegerField()
+
+
+class FavoriteAuthors(models.Model):
+ author = models.ForeignKey(Author, to_field='name', related_name='i_like')
+ likes_author = models.ForeignKey(Author, to_field='name', related_name='likes_me')
+
+ class Meta:
+ ordering = ['id']
+
+
+@python_2_unicode_compatible
+class AuthorAddress(models.Model):
+ author = models.ForeignKey(Author, to_field='name', related_name='addresses')
+ address = models.TextField()
+
+ class Meta:
+ ordering = ['id']
+
+ def __str__(self):
+ return self.address
+
+
+@python_2_unicode_compatible
+class Book(models.Model):
+ title = models.CharField(max_length=255)
+ authors = models.ManyToManyField(Author, related_name='books')
+
+ def __str__(self):
+ return self.title
+
+ class Meta:
+ ordering = ['id']
+
+class BookWithYear(Book):
+ book = models.OneToOneField(Book, parent_link=True)
+ published_year = models.IntegerField()
+ aged_authors = models.ManyToManyField(
+ AuthorWithAge, related_name='books_with_year')
+
+
+@python_2_unicode_compatible
+class Reader(models.Model):
+ name = models.CharField(max_length=50)
+ books_read = models.ManyToManyField(Book, related_name='read_by')
+
+ def __str__(self):
+ return self.name
+
+ class Meta:
+ ordering = ['id']
+
+class BookReview(models.Model):
+ book = models.ForeignKey(BookWithYear)
+ notes = models.TextField(null=True, blank=True)
+
+## Models for default manager tests
+
+class Qualification(models.Model):
+ name = models.CharField(max_length=10)
+
+ class Meta:
+ ordering = ['id']
+
+
+class TeacherManager(models.Manager):
+ def get_query_set(self):
+ return super(TeacherManager, self).get_query_set().prefetch_related('qualifications')
+
+
+@python_2_unicode_compatible
+class Teacher(models.Model):
+ name = models.CharField(max_length=50)
+ qualifications = models.ManyToManyField(Qualification)
+
+ objects = TeacherManager()
+
+ def __str__(self):
+ return "%s (%s)" % (self.name, ", ".join(q.name for q in self.qualifications.all()))
+
+ class Meta:
+ ordering = ['id']
+
+
+class Department(models.Model):
+ name = models.CharField(max_length=50)
+ teachers = models.ManyToManyField(Teacher)
+
+ class Meta:
+ ordering = ['id']
+
+
+## GenericRelation/GenericForeignKey tests
+
+@python_2_unicode_compatible
+class TaggedItem(models.Model):
+ tag = models.SlugField()
+ content_type = models.ForeignKey(ContentType, related_name="taggeditem_set2")
+ object_id = models.PositiveIntegerField()
+ content_object = generic.GenericForeignKey('content_type', 'object_id')
+ created_by_ct = models.ForeignKey(ContentType, null=True,
+ related_name='taggeditem_set3')
+ created_by_fkey = models.PositiveIntegerField(null=True)
+ created_by = generic.GenericForeignKey('created_by_ct', 'created_by_fkey',)
+ favorite_ct = models.ForeignKey(ContentType, null=True,
+ related_name='taggeditem_set4')
+ favorite_fkey = models.CharField(max_length=64, null=True)
+ favorite = generic.GenericForeignKey('favorite_ct', 'favorite_fkey')
+
+ def __str__(self):
+ return self.tag
+
+
+class Bookmark(models.Model):
+ url = models.URLField()
+ tags = generic.GenericRelation(TaggedItem, related_name='bookmarks')
+ favorite_tags = generic.GenericRelation(TaggedItem,
+ content_type_field='favorite_ct',
+ object_id_field='favorite_fkey',
+ related_name='favorite_bookmarks')
+
+
+class Comment(models.Model):
+ comment = models.TextField()
+
+ # Content-object field
+ content_type = models.ForeignKey(ContentType)
+ object_pk = models.TextField()
+ content_object = generic.GenericForeignKey(ct_field="content_type", fk_field="object_pk")
+
+
+## Models for lookup ordering tests
+
+
+class House(models.Model):
+ address = models.CharField(max_length=255)
+
+ class Meta:
+ ordering = ['id']
+
+class Room(models.Model):
+ name = models.CharField(max_length=50)
+ house = models.ForeignKey(House, related_name='rooms')
+
+ class Meta:
+ ordering = ['id']
+
+
+class Person(models.Model):
+ name = models.CharField(max_length=50)
+ houses = models.ManyToManyField(House, related_name='occupants')
+
+ @property
+ def primary_house(self):
+ # Assume business logic forces every person to have at least one house.
+ return sorted(self.houses.all(), key=lambda house: -house.rooms.count())[0]
+
+ class Meta:
+ ordering = ['id']
+
+
+## Models for nullable FK tests
+
+@python_2_unicode_compatible
+class Employee(models.Model):
+ name = models.CharField(max_length=50)
+ boss = models.ForeignKey('self', null=True,
+ related_name='serfs')
+
+ def __str__(self):
+ return self.name
+
+ class Meta:
+ ordering = ['id']