1. import datetime
    
  2. 
    
  3. from django.db import models
    
  4. 
    
  5. 
    
  6. class Place(models.Model):
    
  7.     name = models.CharField(max_length=50)
    
  8.     address = models.CharField(max_length=80)
    
  9. 
    
  10.     class Meta:
    
  11.         ordering = ("name",)
    
  12. 
    
  13. 
    
  14. class Restaurant(Place):
    
  15.     serves_hot_dogs = models.BooleanField(default=False)
    
  16.     serves_pizza = models.BooleanField(default=False)
    
  17. 
    
  18. 
    
  19. class ItalianRestaurant(Restaurant):
    
  20.     serves_gnocchi = models.BooleanField(default=False)
    
  21. 
    
  22. 
    
  23. class ParkingLot(Place):
    
  24.     # An explicit link to the parent (we can control the attribute name).
    
  25.     parent = models.OneToOneField(
    
  26.         Place, models.CASCADE, primary_key=True, parent_link=True
    
  27.     )
    
  28.     capacity = models.IntegerField()
    
  29. 
    
  30. 
    
  31. class ParkingLot3(Place):
    
  32.     # The parent_link connector need not be the pk on the model.
    
  33.     primary_key = models.AutoField(primary_key=True)
    
  34.     parent = models.OneToOneField(Place, models.CASCADE, parent_link=True)
    
  35. 
    
  36. 
    
  37. class ParkingLot4(models.Model):
    
  38.     # Test parent_link connector can be discovered in abstract classes.
    
  39.     parent = models.OneToOneField(Place, models.CASCADE, parent_link=True)
    
  40. 
    
  41.     class Meta:
    
  42.         abstract = True
    
  43. 
    
  44. 
    
  45. class ParkingLot4A(ParkingLot4, Place):
    
  46.     pass
    
  47. 
    
  48. 
    
  49. class ParkingLot4B(Place, ParkingLot4):
    
  50.     pass
    
  51. 
    
  52. 
    
  53. class Supplier(models.Model):
    
  54.     name = models.CharField(max_length=50)
    
  55.     restaurant = models.ForeignKey(Restaurant, models.CASCADE)
    
  56. 
    
  57. 
    
  58. class Wholesaler(Supplier):
    
  59.     retailer = models.ForeignKey(
    
  60.         Supplier, models.CASCADE, related_name="wholesale_supplier"
    
  61.     )
    
  62. 
    
  63. 
    
  64. class Parent(models.Model):
    
  65.     created = models.DateTimeField(default=datetime.datetime.now)
    
  66. 
    
  67. 
    
  68. class Child(Parent):
    
  69.     name = models.CharField(max_length=10)
    
  70. 
    
  71. 
    
  72. class SelfRefParent(models.Model):
    
  73.     parent_data = models.IntegerField()
    
  74.     self_data = models.ForeignKey("self", models.SET_NULL, null=True)
    
  75. 
    
  76. 
    
  77. class SelfRefChild(SelfRefParent):
    
  78.     child_data = models.IntegerField()
    
  79. 
    
  80. 
    
  81. class Article(models.Model):
    
  82.     headline = models.CharField(max_length=100)
    
  83.     pub_date = models.DateTimeField()
    
  84. 
    
  85.     class Meta:
    
  86.         ordering = ("-pub_date", "headline")
    
  87. 
    
  88. 
    
  89. class ArticleWithAuthor(Article):
    
  90.     author = models.CharField(max_length=100)
    
  91. 
    
  92. 
    
  93. class M2MBase(models.Model):
    
  94.     articles = models.ManyToManyField(Article)
    
  95. 
    
  96. 
    
  97. class M2MChild(M2MBase):
    
  98.     name = models.CharField(max_length=50)
    
  99. 
    
  100. 
    
  101. class Evaluation(Article):
    
  102.     quality = models.IntegerField()
    
  103. 
    
  104.     class Meta:
    
  105.         abstract = True
    
  106. 
    
  107. 
    
  108. class QualityControl(Evaluation):
    
  109.     assignee = models.CharField(max_length=50)
    
  110. 
    
  111. 
    
  112. class BaseM(models.Model):
    
  113.     base_name = models.CharField(max_length=100)
    
  114. 
    
  115. 
    
  116. class DerivedM(BaseM):
    
  117.     customPK = models.IntegerField(primary_key=True)
    
  118.     derived_name = models.CharField(max_length=100)
    
  119. 
    
  120. 
    
  121. class AuditBase(models.Model):
    
  122.     planned_date = models.DateField()
    
  123. 
    
  124.     class Meta:
    
  125.         abstract = True
    
  126.         verbose_name_plural = "Audits"
    
  127. 
    
  128. 
    
  129. class CertificationAudit(AuditBase):
    
  130.     class Meta(AuditBase.Meta):
    
  131.         abstract = True
    
  132. 
    
  133. 
    
  134. class InternalCertificationAudit(CertificationAudit):
    
  135.     auditing_dept = models.CharField(max_length=20)
    
  136. 
    
  137. 
    
  138. # Abstract classes don't get m2m tables autocreated.
    
  139. class Person(models.Model):
    
  140.     name = models.CharField(max_length=100)
    
  141. 
    
  142.     class Meta:
    
  143.         ordering = ("name",)
    
  144. 
    
  145. 
    
  146. class AbstractEvent(models.Model):
    
  147.     name = models.CharField(max_length=100)
    
  148.     attendees = models.ManyToManyField(Person, related_name="%(class)s_set")
    
  149. 
    
  150.     class Meta:
    
  151.         abstract = True
    
  152.         ordering = ("name",)
    
  153. 
    
  154. 
    
  155. class BirthdayParty(AbstractEvent):
    
  156.     pass
    
  157. 
    
  158. 
    
  159. class BachelorParty(AbstractEvent):
    
  160.     pass
    
  161. 
    
  162. 
    
  163. class MessyBachelorParty(BachelorParty):
    
  164.     pass
    
  165. 
    
  166. 
    
  167. # Check concrete -> abstract -> concrete inheritance
    
  168. class SearchableLocation(models.Model):
    
  169.     keywords = models.CharField(max_length=255)
    
  170. 
    
  171. 
    
  172. class Station(SearchableLocation):
    
  173.     name = models.CharField(max_length=128)
    
  174. 
    
  175.     class Meta:
    
  176.         abstract = True
    
  177. 
    
  178. 
    
  179. class BusStation(Station):
    
  180.     inbound = models.BooleanField(default=False)
    
  181. 
    
  182. 
    
  183. class TrainStation(Station):
    
  184.     zone = models.IntegerField()
    
  185. 
    
  186. 
    
  187. class User(models.Model):
    
  188.     username = models.CharField(max_length=30, unique=True)
    
  189. 
    
  190. 
    
  191. class Profile(User):
    
  192.     profile_id = models.AutoField(primary_key=True)
    
  193.     extra = models.CharField(max_length=30, blank=True)
    
  194. 
    
  195. 
    
  196. # Check concrete + concrete -> concrete -> concrete
    
  197. class Politician(models.Model):
    
  198.     politician_id = models.AutoField(primary_key=True)
    
  199.     title = models.CharField(max_length=50)
    
  200. 
    
  201. 
    
  202. class Congressman(Person, Politician):
    
  203.     state = models.CharField(max_length=2)
    
  204. 
    
  205. 
    
  206. class Senator(Congressman):
    
  207.     pass