models.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. import datetime
  2. from django.db import models
  3. class Place(models.Model):
  4. name = models.CharField(max_length=50)
  5. address = models.CharField(max_length=80)
  6. class Meta:
  7. ordering = ('name',)
  8. def __str__(self):
  9. return "%s the place" % self.name
  10. class Restaurant(Place):
  11. serves_hot_dogs = models.BooleanField(default=False)
  12. serves_pizza = models.BooleanField(default=False)
  13. def __str__(self):
  14. return "%s the restaurant" % self.name
  15. class ItalianRestaurant(Restaurant):
  16. serves_gnocchi = models.BooleanField(default=False)
  17. def __str__(self):
  18. return "%s the italian restaurant" % self.name
  19. class ParkingLot(Place):
  20. # An explicit link to the parent (we can control the attribute name).
  21. parent = models.OneToOneField(Place, models.CASCADE, primary_key=True, parent_link=True)
  22. capacity = models.IntegerField()
  23. def __str__(self):
  24. return "%s the parking lot" % self.name
  25. class ParkingLot3(Place):
  26. # The parent_link connector need not be the pk on the model.
  27. primary_key = models.AutoField(primary_key=True)
  28. parent = models.OneToOneField(Place, models.CASCADE, parent_link=True)
  29. class ParkingLot4(models.Model):
  30. # Test parent_link connector can be discovered in abstract classes.
  31. parent = models.OneToOneField(Place, models.CASCADE, parent_link=True)
  32. class Meta:
  33. abstract = True
  34. class ParkingLot4A(ParkingLot4, Place):
  35. pass
  36. class ParkingLot4B(Place, ParkingLot4):
  37. pass
  38. class Supplier(models.Model):
  39. name = models.CharField(max_length=50)
  40. restaurant = models.ForeignKey(Restaurant, models.CASCADE)
  41. def __str__(self):
  42. return self.name
  43. class Wholesaler(Supplier):
  44. retailer = models.ForeignKey(Supplier, models.CASCADE, related_name='wholesale_supplier')
  45. class Parent(models.Model):
  46. created = models.DateTimeField(default=datetime.datetime.now)
  47. class Child(Parent):
  48. name = models.CharField(max_length=10)
  49. class SelfRefParent(models.Model):
  50. parent_data = models.IntegerField()
  51. self_data = models.ForeignKey('self', models.SET_NULL, null=True)
  52. class SelfRefChild(SelfRefParent):
  53. child_data = models.IntegerField()
  54. class Article(models.Model):
  55. headline = models.CharField(max_length=100)
  56. pub_date = models.DateTimeField()
  57. class Meta:
  58. ordering = ('-pub_date', 'headline')
  59. def __str__(self):
  60. return self.headline
  61. class ArticleWithAuthor(Article):
  62. author = models.CharField(max_length=100)
  63. class M2MBase(models.Model):
  64. articles = models.ManyToManyField(Article)
  65. class M2MChild(M2MBase):
  66. name = models.CharField(max_length=50)
  67. class Evaluation(Article):
  68. quality = models.IntegerField()
  69. class Meta:
  70. abstract = True
  71. class QualityControl(Evaluation):
  72. assignee = models.CharField(max_length=50)
  73. class BaseM(models.Model):
  74. base_name = models.CharField(max_length=100)
  75. def __str__(self):
  76. return self.base_name
  77. class DerivedM(BaseM):
  78. customPK = models.IntegerField(primary_key=True)
  79. derived_name = models.CharField(max_length=100)
  80. def __str__(self):
  81. return "PK = %d, base_name = %s, derived_name = %s" % (
  82. self.customPK, self.base_name, self.derived_name)
  83. class AuditBase(models.Model):
  84. planned_date = models.DateField()
  85. class Meta:
  86. abstract = True
  87. verbose_name_plural = 'Audits'
  88. class CertificationAudit(AuditBase):
  89. class Meta(AuditBase.Meta):
  90. abstract = True
  91. class InternalCertificationAudit(CertificationAudit):
  92. auditing_dept = models.CharField(max_length=20)
  93. # Abstract classes don't get m2m tables autocreated.
  94. class Person(models.Model):
  95. name = models.CharField(max_length=100)
  96. class Meta:
  97. ordering = ('name',)
  98. def __str__(self):
  99. return self.name
  100. class AbstractEvent(models.Model):
  101. name = models.CharField(max_length=100)
  102. attendees = models.ManyToManyField(Person, related_name="%(class)s_set")
  103. class Meta:
  104. abstract = True
  105. ordering = ('name',)
  106. def __str__(self):
  107. return self.name
  108. class BirthdayParty(AbstractEvent):
  109. pass
  110. class BachelorParty(AbstractEvent):
  111. pass
  112. class MessyBachelorParty(BachelorParty):
  113. pass
  114. # Check concrete -> abstract -> concrete inheritance
  115. class SearchableLocation(models.Model):
  116. keywords = models.CharField(max_length=255)
  117. class Station(SearchableLocation):
  118. name = models.CharField(max_length=128)
  119. class Meta:
  120. abstract = True
  121. class BusStation(Station):
  122. inbound = models.BooleanField(default=False)
  123. class TrainStation(Station):
  124. zone = models.IntegerField()
  125. class User(models.Model):
  126. username = models.CharField(max_length=30, unique=True)
  127. class Profile(User):
  128. profile_id = models.AutoField(primary_key=True)
  129. extra = models.CharField(max_length=30, blank=True)
  130. # Check concrete + concrete -> concrete -> concrete
  131. class Politician(models.Model):
  132. politician_id = models.AutoField(primary_key=True)
  133. title = models.CharField(max_length=50)
  134. class Congressman(Person, Politician):
  135. state = models.CharField(max_length=2)
  136. class Senator(Congressman):
  137. pass