1. from django.contrib.auth.models import User
    
  2. from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
    
  3. from django.contrib.contenttypes.models import ContentType
    
  4. from django.db import models
    
  5. 
    
  6. 
    
  7. class Review(models.Model):
    
  8.     source = models.CharField(max_length=100)
    
  9.     content_type = models.ForeignKey(ContentType, models.CASCADE)
    
  10.     object_id = models.PositiveIntegerField()
    
  11.     content_object = GenericForeignKey()
    
  12. 
    
  13.     class Meta:
    
  14.         ordering = ("source",)
    
  15. 
    
  16.     def __str__(self):
    
  17.         return self.source
    
  18. 
    
  19. 
    
  20. class PersonManager(models.Manager):
    
  21.     def get_by_natural_key(self, name):
    
  22.         return self.get(name=name)
    
  23. 
    
  24. 
    
  25. class Person(models.Model):
    
  26.     name = models.CharField(max_length=100, unique=True)
    
  27. 
    
  28.     objects = PersonManager()
    
  29. 
    
  30.     class Meta:
    
  31.         ordering = ("name",)
    
  32. 
    
  33.     def __str__(self):
    
  34.         return self.name
    
  35. 
    
  36. 
    
  37. # This book manager doesn't do anything interesting; it just
    
  38. # exists to strip out the 'extra_arg' argument to certain
    
  39. # calls. This argument is used to establish that the BookManager
    
  40. # is actually getting used when it should be.
    
  41. class BookManager(models.Manager):
    
  42.     def create(self, *args, extra_arg=None, **kwargs):
    
  43.         return super().create(*args, **kwargs)
    
  44. 
    
  45.     def get_or_create(self, *args, extra_arg=None, **kwargs):
    
  46.         return super().get_or_create(*args, **kwargs)
    
  47. 
    
  48. 
    
  49. class Book(models.Model):
    
  50.     title = models.CharField(max_length=100)
    
  51.     published = models.DateField()
    
  52.     authors = models.ManyToManyField(Person)
    
  53.     editor = models.ForeignKey(
    
  54.         Person, models.SET_NULL, null=True, related_name="edited"
    
  55.     )
    
  56.     reviews = GenericRelation(Review)
    
  57.     pages = models.IntegerField(default=100)
    
  58. 
    
  59.     objects = BookManager()
    
  60. 
    
  61.     class Meta:
    
  62.         ordering = ("title",)
    
  63. 
    
  64.     def __str__(self):
    
  65.         return self.title
    
  66. 
    
  67. 
    
  68. class Pet(models.Model):
    
  69.     name = models.CharField(max_length=100)
    
  70.     owner = models.ForeignKey(Person, models.CASCADE)
    
  71. 
    
  72.     class Meta:
    
  73.         ordering = ("name",)
    
  74. 
    
  75. 
    
  76. class UserProfile(models.Model):
    
  77.     user = models.OneToOneField(User, models.SET_NULL, null=True)
    
  78.     flavor = models.CharField(max_length=100)
    
  79. 
    
  80.     class Meta:
    
  81.         ordering = ("flavor",)