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 Book(models.Model):
    
  8.     title = models.CharField(max_length=50)
    
  9.     year = models.PositiveIntegerField(null=True, blank=True)
    
  10.     author = models.ForeignKey(
    
  11.         User,
    
  12.         models.SET_NULL,
    
  13.         verbose_name="Verbose Author",
    
  14.         related_name="books_authored",
    
  15.         blank=True,
    
  16.         null=True,
    
  17.     )
    
  18.     contributors = models.ManyToManyField(
    
  19.         User,
    
  20.         verbose_name="Verbose Contributors",
    
  21.         related_name="books_contributed",
    
  22.         blank=True,
    
  23.     )
    
  24.     employee = models.ForeignKey(
    
  25.         "Employee",
    
  26.         models.SET_NULL,
    
  27.         verbose_name="Employee",
    
  28.         blank=True,
    
  29.         null=True,
    
  30.     )
    
  31.     is_best_seller = models.BooleanField(default=0, null=True)
    
  32.     date_registered = models.DateField(null=True)
    
  33.     availability = models.BooleanField(
    
  34.         choices=(
    
  35.             (False, "Paid"),
    
  36.             (True, "Free"),
    
  37.             (None, "Obscure"),
    
  38.         ),
    
  39.         null=True,
    
  40.     )
    
  41.     # This field name is intentionally 2 characters long (#16080).
    
  42.     no = models.IntegerField(verbose_name="number", blank=True, null=True)
    
  43. 
    
  44.     def __str__(self):
    
  45.         return self.title
    
  46. 
    
  47. 
    
  48. class ImprovedBook(models.Model):
    
  49.     book = models.OneToOneField(Book, models.CASCADE)
    
  50. 
    
  51. 
    
  52. class Department(models.Model):
    
  53.     code = models.CharField(max_length=4, unique=True)
    
  54.     description = models.CharField(max_length=50, blank=True, null=True)
    
  55. 
    
  56.     def __str__(self):
    
  57.         return self.description
    
  58. 
    
  59. 
    
  60. class Employee(models.Model):
    
  61.     department = models.ForeignKey(Department, models.CASCADE, to_field="code")
    
  62.     name = models.CharField(max_length=100)
    
  63. 
    
  64.     def __str__(self):
    
  65.         return self.name
    
  66. 
    
  67. 
    
  68. class TaggedItem(models.Model):
    
  69.     tag = models.SlugField()
    
  70.     content_type = models.ForeignKey(
    
  71.         ContentType, models.CASCADE, related_name="tagged_items"
    
  72.     )
    
  73.     object_id = models.PositiveIntegerField()
    
  74.     content_object = GenericForeignKey("content_type", "object_id")
    
  75. 
    
  76.     def __str__(self):
    
  77.         return self.tag
    
  78. 
    
  79. 
    
  80. class Bookmark(models.Model):
    
  81.     url = models.URLField()
    
  82.     tags = GenericRelation(TaggedItem)
    
  83. 
    
  84.     CHOICES = [
    
  85.         ("a", "A"),
    
  86.         (None, "None"),
    
  87.         ("", "-"),
    
  88.     ]
    
  89.     none_or_null = models.CharField(
    
  90.         max_length=20, choices=CHOICES, blank=True, null=True
    
  91.     )
    
  92. 
    
  93.     def __str__(self):
    
  94.         return self.url