1. import uuid
    
  2. 
    
  3. from django.contrib.auth.models import User
    
  4. from django.db import models
    
  5. 
    
  6. 
    
  7. class MyFileField(models.FileField):
    
  8.     pass
    
  9. 
    
  10. 
    
  11. class Member(models.Model):
    
  12.     name = models.CharField(max_length=100)
    
  13.     birthdate = models.DateTimeField(blank=True, null=True)
    
  14.     gender = models.CharField(
    
  15.         max_length=1, blank=True, choices=[("M", "Male"), ("F", "Female")]
    
  16.     )
    
  17.     email = models.EmailField(blank=True)
    
  18. 
    
  19.     def __str__(self):
    
  20.         return self.name
    
  21. 
    
  22. 
    
  23. class Artist(models.Model):
    
  24.     pass
    
  25. 
    
  26. 
    
  27. class Band(Artist):
    
  28.     uuid = models.UUIDField(unique=True, default=uuid.uuid4)
    
  29.     name = models.CharField(max_length=100)
    
  30.     style = models.CharField(max_length=20)
    
  31.     members = models.ManyToManyField(Member)
    
  32. 
    
  33.     def __str__(self):
    
  34.         return self.name
    
  35. 
    
  36. 
    
  37. class UnsafeLimitChoicesTo(models.Model):
    
  38.     band = models.ForeignKey(
    
  39.         Band,
    
  40.         models.CASCADE,
    
  41.         limit_choices_to={"name": '"&><escapeme'},
    
  42.     )
    
  43. 
    
  44. 
    
  45. class Album(models.Model):
    
  46.     band = models.ForeignKey(Band, models.CASCADE, to_field="uuid")
    
  47.     featuring = models.ManyToManyField(Band, related_name="featured")
    
  48.     name = models.CharField(max_length=100)
    
  49.     cover_art = models.FileField(upload_to="albums")
    
  50.     backside_art = MyFileField(upload_to="albums_back", null=True)
    
  51. 
    
  52.     def __str__(self):
    
  53.         return self.name
    
  54. 
    
  55. 
    
  56. class ReleaseEvent(models.Model):
    
  57.     """
    
  58.     Used to check that autocomplete widget correctly resolves attname for FK as
    
  59.     PK example.
    
  60.     """
    
  61. 
    
  62.     album = models.ForeignKey(Album, models.CASCADE, primary_key=True)
    
  63.     name = models.CharField(max_length=100)
    
  64. 
    
  65.     class Meta:
    
  66.         ordering = ["name"]
    
  67. 
    
  68.     def __str__(self):
    
  69.         return self.name
    
  70. 
    
  71. 
    
  72. class VideoStream(models.Model):
    
  73.     release_event = models.ForeignKey(ReleaseEvent, models.CASCADE)
    
  74. 
    
  75. 
    
  76. class HiddenInventoryManager(models.Manager):
    
  77.     def get_queryset(self):
    
  78.         return super().get_queryset().filter(hidden=False)
    
  79. 
    
  80. 
    
  81. class Inventory(models.Model):
    
  82.     barcode = models.PositiveIntegerField(unique=True)
    
  83.     parent = models.ForeignKey(
    
  84.         "self", models.SET_NULL, to_field="barcode", blank=True, null=True
    
  85.     )
    
  86.     name = models.CharField(blank=False, max_length=20)
    
  87.     hidden = models.BooleanField(default=False)
    
  88. 
    
  89.     # see #9258
    
  90.     default_manager = models.Manager()
    
  91.     objects = HiddenInventoryManager()
    
  92. 
    
  93.     def __str__(self):
    
  94.         return self.name
    
  95. 
    
  96. 
    
  97. class Event(models.Model):
    
  98.     main_band = models.ForeignKey(
    
  99.         Band,
    
  100.         models.CASCADE,
    
  101.         limit_choices_to=models.Q(pk__gt=0),
    
  102.         related_name="events_main_band_at",
    
  103.     )
    
  104.     supporting_bands = models.ManyToManyField(
    
  105.         Band,
    
  106.         blank=True,
    
  107.         related_name="events_supporting_band_at",
    
  108.         help_text="Supporting Bands.",
    
  109.     )
    
  110.     start_date = models.DateField(blank=True, null=True)
    
  111.     start_time = models.TimeField(blank=True, null=True)
    
  112.     description = models.TextField(blank=True)
    
  113.     link = models.URLField(blank=True)
    
  114.     min_age = models.IntegerField(blank=True, null=True)
    
  115. 
    
  116. 
    
  117. class Car(models.Model):
    
  118.     owner = models.ForeignKey(User, models.CASCADE)
    
  119.     make = models.CharField(max_length=30)
    
  120.     model = models.CharField(max_length=30)
    
  121. 
    
  122.     def __str__(self):
    
  123.         return "%s %s" % (self.make, self.model)
    
  124. 
    
  125. 
    
  126. class CarTire(models.Model):
    
  127.     """
    
  128.     A single car tire. This to test that a user can only select their own cars.
    
  129.     """
    
  130. 
    
  131.     car = models.ForeignKey(Car, models.CASCADE)
    
  132. 
    
  133. 
    
  134. class Honeycomb(models.Model):
    
  135.     id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    
  136.     location = models.CharField(max_length=20)
    
  137. 
    
  138. 
    
  139. class Bee(models.Model):
    
  140.     """
    
  141.     A model with a FK to a model that won't be registered with the admin
    
  142.     (Honeycomb) so the corresponding raw ID widget won't have a magnifying
    
  143.     glass link to select related honeycomb instances.
    
  144.     """
    
  145. 
    
  146.     honeycomb = models.ForeignKey(Honeycomb, models.CASCADE)
    
  147. 
    
  148. 
    
  149. class Individual(models.Model):
    
  150.     """
    
  151.     A model with a FK to itself. It won't be registered with the admin, so the
    
  152.     corresponding raw ID widget won't have a magnifying glass link to select
    
  153.     related instances (rendering will be called programmatically in this case).
    
  154.     """
    
  155. 
    
  156.     name = models.CharField(max_length=20)
    
  157.     parent = models.ForeignKey("self", models.SET_NULL, null=True)
    
  158.     soulmate = models.ForeignKey(
    
  159.         "self", models.CASCADE, null=True, related_name="soulmates"
    
  160.     )
    
  161. 
    
  162. 
    
  163. class Company(models.Model):
    
  164.     name = models.CharField(max_length=20)
    
  165. 
    
  166. 
    
  167. class Advisor(models.Model):
    
  168.     """
    
  169.     A model with a m2m to a model that won't be registered with the admin
    
  170.     (Company) so the corresponding raw ID widget won't have a magnifying
    
  171.     glass link to select related company instances.
    
  172.     """
    
  173. 
    
  174.     name = models.CharField(max_length=20)
    
  175.     companies = models.ManyToManyField(Company)
    
  176. 
    
  177. 
    
  178. class Student(models.Model):
    
  179.     name = models.CharField(max_length=255)
    
  180. 
    
  181.     class Meta:
    
  182.         ordering = ("name",)
    
  183. 
    
  184.     def __str__(self):
    
  185.         return self.name
    
  186. 
    
  187. 
    
  188. class School(models.Model):
    
  189.     name = models.CharField(max_length=255)
    
  190.     students = models.ManyToManyField(Student, related_name="current_schools")
    
  191.     alumni = models.ManyToManyField(Student, related_name="previous_schools")
    
  192. 
    
  193.     def __str__(self):
    
  194.         return self.name
    
  195. 
    
  196. 
    
  197. class Profile(models.Model):
    
  198.     user = models.ForeignKey("auth.User", models.CASCADE, to_field="username")
    
  199. 
    
  200.     def __str__(self):
    
  201.         return self.user.username