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 Author(models.Model):
    
  7.     name = models.CharField(max_length=50, unique=True)
    
  8.     favorite_books = models.ManyToManyField(
    
  9.         "Book",
    
  10.         related_name="preferred_by_authors",
    
  11.         related_query_name="preferred_by_authors",
    
  12.     )
    
  13.     content_type = models.ForeignKey(ContentType, models.CASCADE, null=True)
    
  14.     object_id = models.PositiveIntegerField(null=True)
    
  15.     content_object = GenericForeignKey()
    
  16. 
    
  17. 
    
  18. class Editor(models.Model):
    
  19.     name = models.CharField(max_length=255)
    
  20. 
    
  21. 
    
  22. class Book(models.Model):
    
  23.     AVAILABLE = "available"
    
  24.     RESERVED = "reserved"
    
  25.     RENTED = "rented"
    
  26.     STATES = (
    
  27.         (AVAILABLE, "Available"),
    
  28.         (RESERVED, "reserved"),
    
  29.         (RENTED, "Rented"),
    
  30.     )
    
  31.     title = models.CharField(max_length=255)
    
  32.     author = models.ForeignKey(
    
  33.         Author,
    
  34.         models.CASCADE,
    
  35.         related_name="books",
    
  36.         related_query_name="book",
    
  37.     )
    
  38.     editor = models.ForeignKey(Editor, models.CASCADE)
    
  39.     generic_author = GenericRelation(Author)
    
  40.     state = models.CharField(max_length=9, choices=STATES, default=AVAILABLE)
    
  41. 
    
  42. 
    
  43. class Borrower(models.Model):
    
  44.     name = models.CharField(max_length=50, unique=True)
    
  45. 
    
  46. 
    
  47. class Reservation(models.Model):
    
  48.     NEW = "new"
    
  49.     STOPPED = "stopped"
    
  50.     STATES = (
    
  51.         (NEW, "New"),
    
  52.         (STOPPED, "Stopped"),
    
  53.     )
    
  54.     borrower = models.ForeignKey(
    
  55.         Borrower,
    
  56.         models.CASCADE,
    
  57.         related_name="reservations",
    
  58.         related_query_name="reservation",
    
  59.     )
    
  60.     book = models.ForeignKey(
    
  61.         Book,
    
  62.         models.CASCADE,
    
  63.         related_name="reservations",
    
  64.         related_query_name="reservation",
    
  65.     )
    
  66.     state = models.CharField(max_length=7, choices=STATES, default=NEW)
    
  67. 
    
  68. 
    
  69. class RentalSession(models.Model):
    
  70.     NEW = "new"
    
  71.     STOPPED = "stopped"
    
  72.     STATES = (
    
  73.         (NEW, "New"),
    
  74.         (STOPPED, "Stopped"),
    
  75.     )
    
  76.     borrower = models.ForeignKey(
    
  77.         Borrower,
    
  78.         models.CASCADE,
    
  79.         related_name="rental_sessions",
    
  80.         related_query_name="rental_session",
    
  81.     )
    
  82.     book = models.ForeignKey(
    
  83.         Book,
    
  84.         models.CASCADE,
    
  85.         related_name="rental_sessions",
    
  86.         related_query_name="rental_session",
    
  87.     )
    
  88.     state = models.CharField(max_length=7, choices=STATES, default=NEW)
    
  89. 
    
  90. 
    
  91. class Seller(models.Model):
    
  92.     name = models.CharField(max_length=255)
    
  93. 
    
  94. 
    
  95. class Currency(models.Model):
    
  96.     currency = models.CharField(max_length=3)
    
  97. 
    
  98. 
    
  99. class ExchangeRate(models.Model):
    
  100.     rate_date = models.DateField()
    
  101.     from_currency = models.ForeignKey(
    
  102.         Currency,
    
  103.         models.CASCADE,
    
  104.         related_name="rates_from",
    
  105.     )
    
  106.     to_currency = models.ForeignKey(
    
  107.         Currency,
    
  108.         models.CASCADE,
    
  109.         related_name="rates_to",
    
  110.     )
    
  111.     rate = models.DecimalField(max_digits=6, decimal_places=4)
    
  112. 
    
  113. 
    
  114. class BookDailySales(models.Model):
    
  115.     book = models.ForeignKey(Book, models.CASCADE, related_name="daily_sales")
    
  116.     sale_date = models.DateField()
    
  117.     currency = models.ForeignKey(Currency, models.CASCADE)
    
  118.     seller = models.ForeignKey(Seller, models.CASCADE)
    
  119.     sales = models.DecimalField(max_digits=10, decimal_places=2)