1. from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
    
  2. from django.contrib.contenttypes.models import ContentType
    
  3. from django.db import models
    
  4. 
    
  5. 
    
  6. class Episode(models.Model):
    
  7.     name = models.CharField(max_length=100)
    
  8.     length = models.CharField(max_length=100, blank=True)
    
  9.     author = models.CharField(max_length=100, blank=True)
    
  10. 
    
  11. 
    
  12. class Media(models.Model):
    
  13.     """
    
  14.     Media that can associated to any object.
    
  15.     """
    
  16. 
    
  17.     content_type = models.ForeignKey(ContentType, models.CASCADE)
    
  18.     object_id = models.PositiveIntegerField()
    
  19.     content_object = GenericForeignKey()
    
  20.     url = models.URLField()
    
  21.     description = models.CharField(max_length=100, blank=True)
    
  22.     keywords = models.CharField(max_length=100, blank=True)
    
  23. 
    
  24.     def __str__(self):
    
  25.         return self.url
    
  26. 
    
  27. 
    
  28. #
    
  29. # Generic inline with unique_together
    
  30. #
    
  31. class Category(models.Model):
    
  32.     name = models.CharField(max_length=50)
    
  33. 
    
  34. 
    
  35. class PhoneNumber(models.Model):
    
  36.     content_type = models.ForeignKey(ContentType, models.CASCADE)
    
  37.     object_id = models.PositiveIntegerField()
    
  38.     content_object = GenericForeignKey("content_type", "object_id")
    
  39.     phone_number = models.CharField(max_length=30)
    
  40.     category = models.ForeignKey(Category, models.SET_NULL, null=True, blank=True)
    
  41. 
    
  42.     class Meta:
    
  43.         unique_together = (
    
  44.             (
    
  45.                 "content_type",
    
  46.                 "object_id",
    
  47.                 "phone_number",
    
  48.             ),
    
  49.         )
    
  50. 
    
  51. 
    
  52. class Contact(models.Model):
    
  53.     name = models.CharField(max_length=50)
    
  54.     phone_numbers = GenericRelation(PhoneNumber, related_query_name="phone_numbers")
    
  55. 
    
  56. 
    
  57. #
    
  58. # Generic inline with can_delete=False
    
  59. #
    
  60. class EpisodePermanent(Episode):
    
  61.     pass