1. import datetime
    
  2. import uuid
    
  3. 
    
  4. from django.db import models
    
  5. 
    
  6. 
    
  7. class Author(models.Model):
    
  8.     name = models.CharField(max_length=100)
    
  9. 
    
  10.     class Meta:
    
  11.         ordering = ("name",)
    
  12. 
    
  13.     def __str__(self):
    
  14.         return self.name
    
  15. 
    
  16. 
    
  17. class BetterAuthor(Author):
    
  18.     write_speed = models.IntegerField()
    
  19. 
    
  20. 
    
  21. class Book(models.Model):
    
  22.     author = models.ForeignKey(Author, models.CASCADE)
    
  23.     title = models.CharField(max_length=100)
    
  24. 
    
  25.     class Meta:
    
  26.         unique_together = (("author", "title"),)
    
  27.         ordering = ["id"]
    
  28. 
    
  29.     def __str__(self):
    
  30.         return self.title
    
  31. 
    
  32.     def clean(self):
    
  33.         # Ensure author is always accessible in clean method
    
  34.         assert self.author.name is not None
    
  35. 
    
  36. 
    
  37. class BookWithCustomPK(models.Model):
    
  38.     my_pk = models.DecimalField(max_digits=5, decimal_places=0, primary_key=True)
    
  39.     author = models.ForeignKey(Author, models.CASCADE)
    
  40.     title = models.CharField(max_length=100)
    
  41. 
    
  42.     def __str__(self):
    
  43.         return "%s: %s" % (self.my_pk, self.title)
    
  44. 
    
  45. 
    
  46. class Editor(models.Model):
    
  47.     name = models.CharField(max_length=100)
    
  48. 
    
  49. 
    
  50. class BookWithOptionalAltEditor(models.Model):
    
  51.     author = models.ForeignKey(Author, models.CASCADE)
    
  52.     # Optional secondary author
    
  53.     alt_editor = models.ForeignKey(Editor, models.SET_NULL, blank=True, null=True)
    
  54.     title = models.CharField(max_length=100)
    
  55. 
    
  56.     class Meta:
    
  57.         unique_together = (("author", "title", "alt_editor"),)
    
  58. 
    
  59.     def __str__(self):
    
  60.         return self.title
    
  61. 
    
  62. 
    
  63. class AlternateBook(Book):
    
  64.     notes = models.CharField(max_length=100)
    
  65. 
    
  66.     def __str__(self):
    
  67.         return "%s - %s" % (self.title, self.notes)
    
  68. 
    
  69. 
    
  70. class AuthorMeeting(models.Model):
    
  71.     name = models.CharField(max_length=100)
    
  72.     authors = models.ManyToManyField(Author)
    
  73.     created = models.DateField(editable=False)
    
  74. 
    
  75.     def __str__(self):
    
  76.         return self.name
    
  77. 
    
  78. 
    
  79. class CustomPrimaryKey(models.Model):
    
  80.     my_pk = models.CharField(max_length=10, primary_key=True)
    
  81.     some_field = models.CharField(max_length=100)
    
  82. 
    
  83. 
    
  84. # models for inheritance tests.
    
  85. 
    
  86. 
    
  87. class Place(models.Model):
    
  88.     name = models.CharField(max_length=50)
    
  89.     city = models.CharField(max_length=50)
    
  90. 
    
  91.     def __str__(self):
    
  92.         return self.name
    
  93. 
    
  94. 
    
  95. class Owner(models.Model):
    
  96.     auto_id = models.AutoField(primary_key=True)
    
  97.     name = models.CharField(max_length=100)
    
  98.     place = models.ForeignKey(Place, models.CASCADE)
    
  99. 
    
  100.     def __str__(self):
    
  101.         return "%s at %s" % (self.name, self.place)
    
  102. 
    
  103. 
    
  104. class Location(models.Model):
    
  105.     place = models.ForeignKey(Place, models.CASCADE, unique=True)
    
  106.     # this is purely for testing the data doesn't matter here :)
    
  107.     lat = models.CharField(max_length=100)
    
  108.     lon = models.CharField(max_length=100)
    
  109. 
    
  110. 
    
  111. class OwnerProfile(models.Model):
    
  112.     owner = models.OneToOneField(Owner, models.CASCADE, primary_key=True)
    
  113.     age = models.PositiveIntegerField()
    
  114. 
    
  115.     def __str__(self):
    
  116.         return "%s is %d" % (self.owner.name, self.age)
    
  117. 
    
  118. 
    
  119. class Restaurant(Place):
    
  120.     serves_pizza = models.BooleanField(default=False)
    
  121. 
    
  122. 
    
  123. class Product(models.Model):
    
  124.     slug = models.SlugField(unique=True)
    
  125. 
    
  126.     def __str__(self):
    
  127.         return self.slug
    
  128. 
    
  129. 
    
  130. class Price(models.Model):
    
  131.     price = models.DecimalField(max_digits=10, decimal_places=2)
    
  132.     quantity = models.PositiveIntegerField()
    
  133. 
    
  134.     class Meta:
    
  135.         unique_together = (("price", "quantity"),)
    
  136. 
    
  137.     def __str__(self):
    
  138.         return "%s for %s" % (self.quantity, self.price)
    
  139. 
    
  140. 
    
  141. class MexicanRestaurant(Restaurant):
    
  142.     serves_tacos = models.BooleanField(default=False)
    
  143. 
    
  144. 
    
  145. class ClassyMexicanRestaurant(MexicanRestaurant):
    
  146.     the_restaurant = models.OneToOneField(
    
  147.         MexicanRestaurant, models.CASCADE, parent_link=True, primary_key=True
    
  148.     )
    
  149.     tacos_are_yummy = models.BooleanField(default=False)
    
  150. 
    
  151. 
    
  152. # models for testing unique_together validation when a fk is involved and
    
  153. # using inlineformset_factory.
    
  154. class Repository(models.Model):
    
  155.     name = models.CharField(max_length=25)
    
  156. 
    
  157.     def __str__(self):
    
  158.         return self.name
    
  159. 
    
  160. 
    
  161. class Revision(models.Model):
    
  162.     repository = models.ForeignKey(Repository, models.CASCADE)
    
  163.     revision = models.CharField(max_length=40)
    
  164. 
    
  165.     class Meta:
    
  166.         unique_together = (("repository", "revision"),)
    
  167. 
    
  168.     def __str__(self):
    
  169.         return "%s (%s)" % (self.revision, str(self.repository))
    
  170. 
    
  171. 
    
  172. # models for testing callable defaults (see bug #7975). If you define a model
    
  173. # with a callable default value, you cannot rely on the initial value in a
    
  174. # form.
    
  175. class Person(models.Model):
    
  176.     name = models.CharField(max_length=128)
    
  177. 
    
  178. 
    
  179. class Membership(models.Model):
    
  180.     person = models.ForeignKey(Person, models.CASCADE)
    
  181.     date_joined = models.DateTimeField(default=datetime.datetime.now)
    
  182.     karma = models.IntegerField()
    
  183. 
    
  184. 
    
  185. # models for testing a null=True fk to a parent
    
  186. class Team(models.Model):
    
  187.     name = models.CharField(max_length=100)
    
  188. 
    
  189. 
    
  190. class Player(models.Model):
    
  191.     team = models.ForeignKey(Team, models.SET_NULL, null=True)
    
  192.     name = models.CharField(max_length=100)
    
  193. 
    
  194.     def __str__(self):
    
  195.         return self.name
    
  196. 
    
  197. 
    
  198. # Models for testing custom ModelForm save methods in formsets and inline formsets
    
  199. class Poet(models.Model):
    
  200.     name = models.CharField(max_length=100)
    
  201. 
    
  202.     def __str__(self):
    
  203.         return self.name
    
  204. 
    
  205. 
    
  206. class Poem(models.Model):
    
  207.     poet = models.ForeignKey(Poet, models.CASCADE)
    
  208.     name = models.CharField(max_length=100)
    
  209. 
    
  210.     def __str__(self):
    
  211.         return self.name
    
  212. 
    
  213. 
    
  214. class Post(models.Model):
    
  215.     title = models.CharField(max_length=50, unique_for_date="posted", blank=True)
    
  216.     slug = models.CharField(max_length=50, unique_for_year="posted", blank=True)
    
  217.     subtitle = models.CharField(max_length=50, unique_for_month="posted", blank=True)
    
  218.     posted = models.DateField()
    
  219. 
    
  220.     def __str__(self):
    
  221.         return self.title
    
  222. 
    
  223. 
    
  224. # Models for testing UUID primary keys
    
  225. class UUIDPKParent(models.Model):
    
  226.     uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    
  227.     name = models.CharField(max_length=255)
    
  228. 
    
  229. 
    
  230. class UUIDPKChild(models.Model):
    
  231.     uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    
  232.     name = models.CharField(max_length=255)
    
  233.     parent = models.ForeignKey(UUIDPKParent, models.CASCADE)
    
  234. 
    
  235. 
    
  236. class ChildWithEditablePK(models.Model):
    
  237.     name = models.CharField(max_length=255, primary_key=True)
    
  238.     parent = models.ForeignKey(UUIDPKParent, models.CASCADE)
    
  239. 
    
  240. 
    
  241. class AutoPKChildOfUUIDPKParent(models.Model):
    
  242.     name = models.CharField(max_length=255)
    
  243.     parent = models.ForeignKey(UUIDPKParent, models.CASCADE)
    
  244. 
    
  245. 
    
  246. class AutoPKParent(models.Model):
    
  247.     name = models.CharField(max_length=255)
    
  248. 
    
  249. 
    
  250. class UUIDPKChildOfAutoPKParent(models.Model):
    
  251.     uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    
  252.     name = models.CharField(max_length=255)
    
  253.     parent = models.ForeignKey(AutoPKParent, models.CASCADE)
    
  254. 
    
  255. 
    
  256. class ParentWithUUIDAlternateKey(models.Model):
    
  257.     uuid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)
    
  258.     name = models.CharField(max_length=50)
    
  259. 
    
  260. 
    
  261. class ChildRelatedViaAK(models.Model):
    
  262.     name = models.CharField(max_length=255)
    
  263.     parent = models.ForeignKey(
    
  264.         ParentWithUUIDAlternateKey, models.CASCADE, to_field="uuid"
    
  265.     )