mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Thanks to mkai for the report and debugging, and tmitchell and Przemek Lewandowski for their work on the patch. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17744 bcc190cf-cafb-0310-a4f2-bffc1f526a37
		
			
				
	
	
		
			179 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from django.contrib.contenttypes import generic
 | |
| from django.contrib.contenttypes.models import ContentType
 | |
| from django.db import models
 | |
| 
 | |
| ## Basic tests
 | |
| 
 | |
| 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 __unicode__(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']
 | |
| 
 | |
| 
 | |
| class AuthorAddress(models.Model):
 | |
|     author = models.ForeignKey(Author, to_field='name', related_name='addresses')
 | |
|     address = models.TextField()
 | |
| 
 | |
|     class Meta:
 | |
|         ordering = ['id']
 | |
| 
 | |
|     def __unicode__(self):
 | |
|         return self.address
 | |
| 
 | |
| 
 | |
| class Book(models.Model):
 | |
|     title = models.CharField(max_length=255)
 | |
|     authors = models.ManyToManyField(Author, related_name='books')
 | |
| 
 | |
|     def __unicode__(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')
 | |
| 
 | |
| 
 | |
| class Reader(models.Model):
 | |
|     name = models.CharField(max_length=50)
 | |
|     books_read = models.ManyToManyField(Book, related_name='read_by')
 | |
| 
 | |
|     def __unicode__(self):
 | |
|         return self.name
 | |
| 
 | |
|     class Meta:
 | |
|         ordering = ['id']
 | |
| 
 | |
| 
 | |
| ## 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')
 | |
| 
 | |
| 
 | |
| class Teacher(models.Model):
 | |
|     name = models.CharField(max_length=50)
 | |
|     qualifications = models.ManyToManyField(Qualification)
 | |
| 
 | |
|     objects = TeacherManager()
 | |
| 
 | |
|     def __unicode__(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
 | |
| 
 | |
| 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',)
 | |
| 
 | |
|     def __unicode__(self):
 | |
|         return self.tag
 | |
| 
 | |
| 
 | |
| class Bookmark(models.Model):
 | |
|     url = models.URLField()
 | |
|     tags = generic.GenericRelation(TaggedItem)
 | |
| 
 | |
| 
 | |
| 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
 | |
| 
 | |
| class Employee(models.Model):
 | |
|     name = models.CharField(max_length=50)
 | |
|     boss = models.ForeignKey('self', null=True,
 | |
|                              related_name='serfs')
 | |
| 
 | |
|     def __unicode__(self):
 | |
|         return self.name
 | |
| 
 | |
|     class Meta:
 | |
|         ordering = ['id']
 |