1. import datetime
    
  2. import tempfile
    
  3. import uuid
    
  4. 
    
  5. from django.contrib import admin
    
  6. from django.contrib.auth.models import User
    
  7. from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
    
  8. from django.contrib.contenttypes.models import ContentType
    
  9. from django.core.exceptions import ValidationError
    
  10. from django.core.files.storage import FileSystemStorage
    
  11. from django.db import models
    
  12. 
    
  13. 
    
  14. class Section(models.Model):
    
  15.     """
    
  16.     A simple section that links to articles, to test linking to related items
    
  17.     in admin views.
    
  18.     """
    
  19. 
    
  20.     name = models.CharField(max_length=100)
    
  21. 
    
  22.     def __str__(self):
    
  23.         return self.name
    
  24. 
    
  25.     @property
    
  26.     def name_property(self):
    
  27.         """
    
  28.         A property that simply returns the name. Used to test #24461
    
  29.         """
    
  30.         return self.name
    
  31. 
    
  32. 
    
  33. class Article(models.Model):
    
  34.     """
    
  35.     A simple article to test admin views. Test backwards compatibility.
    
  36.     """
    
  37. 
    
  38.     title = models.CharField(max_length=100)
    
  39.     content = models.TextField()
    
  40.     date = models.DateTimeField()
    
  41.     section = models.ForeignKey(Section, models.CASCADE, null=True, blank=True)
    
  42.     another_section = models.ForeignKey(
    
  43.         Section, models.CASCADE, null=True, blank=True, related_name="+"
    
  44.     )
    
  45.     sub_section = models.ForeignKey(
    
  46.         Section, models.SET_NULL, null=True, blank=True, related_name="+"
    
  47.     )
    
  48. 
    
  49.     def __str__(self):
    
  50.         return self.title
    
  51. 
    
  52.     @admin.display(ordering="date", description="")
    
  53.     def model_year(self):
    
  54.         return self.date.year
    
  55. 
    
  56.     @admin.display(ordering="-date", description="")
    
  57.     def model_year_reversed(self):
    
  58.         return self.date.year
    
  59. 
    
  60.     @property
    
  61.     @admin.display(ordering="date")
    
  62.     def model_property_year(self):
    
  63.         return self.date.year
    
  64. 
    
  65.     @property
    
  66.     def model_month(self):
    
  67.         return self.date.month
    
  68. 
    
  69. 
    
  70. class Book(models.Model):
    
  71.     """
    
  72.     A simple book that has chapters.
    
  73.     """
    
  74. 
    
  75.     name = models.CharField(max_length=100, verbose_name="¿Name?")
    
  76. 
    
  77.     def __str__(self):
    
  78.         return self.name
    
  79. 
    
  80. 
    
  81. class Promo(models.Model):
    
  82.     name = models.CharField(max_length=100, verbose_name="¿Name?")
    
  83.     book = models.ForeignKey(Book, models.CASCADE)
    
  84.     author = models.ForeignKey(User, models.SET_NULL, blank=True, null=True)
    
  85. 
    
  86.     def __str__(self):
    
  87.         return self.name
    
  88. 
    
  89. 
    
  90. class Chapter(models.Model):
    
  91.     title = models.CharField(max_length=100, verbose_name="¿Title?")
    
  92.     content = models.TextField()
    
  93.     book = models.ForeignKey(Book, models.CASCADE)
    
  94. 
    
  95.     class Meta:
    
  96.         # Use a utf-8 bytestring to ensure it works (see #11710)
    
  97.         verbose_name = "¿Chapter?"
    
  98. 
    
  99.     def __str__(self):
    
  100.         return self.title
    
  101. 
    
  102. 
    
  103. class ChapterXtra1(models.Model):
    
  104.     chap = models.OneToOneField(Chapter, models.CASCADE, verbose_name="¿Chap?")
    
  105.     xtra = models.CharField(max_length=100, verbose_name="¿Xtra?")
    
  106.     guest_author = models.ForeignKey(User, models.SET_NULL, blank=True, null=True)
    
  107. 
    
  108.     def __str__(self):
    
  109.         return "¿Xtra1: %s" % self.xtra
    
  110. 
    
  111. 
    
  112. class ChapterXtra2(models.Model):
    
  113.     chap = models.OneToOneField(Chapter, models.CASCADE, verbose_name="¿Chap?")
    
  114.     xtra = models.CharField(max_length=100, verbose_name="¿Xtra?")
    
  115. 
    
  116.     def __str__(self):
    
  117.         return "¿Xtra2: %s" % self.xtra
    
  118. 
    
  119. 
    
  120. class RowLevelChangePermissionModel(models.Model):
    
  121.     name = models.CharField(max_length=100, blank=True)
    
  122. 
    
  123. 
    
  124. class CustomArticle(models.Model):
    
  125.     content = models.TextField()
    
  126.     date = models.DateTimeField()
    
  127. 
    
  128. 
    
  129. class ModelWithStringPrimaryKey(models.Model):
    
  130.     string_pk = models.CharField(max_length=255, primary_key=True)
    
  131. 
    
  132.     def __str__(self):
    
  133.         return self.string_pk
    
  134. 
    
  135.     def get_absolute_url(self):
    
  136.         return "/dummy/%s/" % self.string_pk
    
  137. 
    
  138. 
    
  139. class Color(models.Model):
    
  140.     value = models.CharField(max_length=10)
    
  141.     warm = models.BooleanField(default=False)
    
  142. 
    
  143.     def __str__(self):
    
  144.         return self.value
    
  145. 
    
  146. 
    
  147. # we replicate Color to register with another ModelAdmin
    
  148. class Color2(Color):
    
  149.     class Meta:
    
  150.         proxy = True
    
  151. 
    
  152. 
    
  153. class Thing(models.Model):
    
  154.     title = models.CharField(max_length=20)
    
  155.     color = models.ForeignKey(Color, models.CASCADE, limit_choices_to={"warm": True})
    
  156.     pub_date = models.DateField(blank=True, null=True)
    
  157. 
    
  158.     def __str__(self):
    
  159.         return self.title
    
  160. 
    
  161. 
    
  162. class Actor(models.Model):
    
  163.     name = models.CharField(max_length=50)
    
  164.     age = models.IntegerField()
    
  165.     title = models.CharField(max_length=50, null=True, blank=True)
    
  166. 
    
  167.     def __str__(self):
    
  168.         return self.name
    
  169. 
    
  170. 
    
  171. class Inquisition(models.Model):
    
  172.     expected = models.BooleanField(default=False)
    
  173.     leader = models.ForeignKey(Actor, models.CASCADE)
    
  174.     country = models.CharField(max_length=20)
    
  175. 
    
  176.     def __str__(self):
    
  177.         return "by %s from %s" % (self.leader, self.country)
    
  178. 
    
  179. 
    
  180. class Sketch(models.Model):
    
  181.     title = models.CharField(max_length=100)
    
  182.     inquisition = models.ForeignKey(
    
  183.         Inquisition,
    
  184.         models.CASCADE,
    
  185.         limit_choices_to={
    
  186.             "leader__name": "Palin",
    
  187.             "leader__age": 27,
    
  188.             "expected": False,
    
  189.         },
    
  190.     )
    
  191.     defendant0 = models.ForeignKey(
    
  192.         Actor,
    
  193.         models.CASCADE,
    
  194.         limit_choices_to={"title__isnull": False},
    
  195.         related_name="as_defendant0",
    
  196.     )
    
  197.     defendant1 = models.ForeignKey(
    
  198.         Actor,
    
  199.         models.CASCADE,
    
  200.         limit_choices_to={"title__isnull": True},
    
  201.         related_name="as_defendant1",
    
  202.     )
    
  203. 
    
  204.     def __str__(self):
    
  205.         return self.title
    
  206. 
    
  207. 
    
  208. def today_callable_dict():
    
  209.     return {"last_action__gte": datetime.datetime.today()}
    
  210. 
    
  211. 
    
  212. def today_callable_q():
    
  213.     return models.Q(last_action__gte=datetime.datetime.today())
    
  214. 
    
  215. 
    
  216. class Character(models.Model):
    
  217.     username = models.CharField(max_length=100)
    
  218.     last_action = models.DateTimeField()
    
  219. 
    
  220.     def __str__(self):
    
  221.         return self.username
    
  222. 
    
  223. 
    
  224. class StumpJoke(models.Model):
    
  225.     variation = models.CharField(max_length=100)
    
  226.     most_recently_fooled = models.ForeignKey(
    
  227.         Character,
    
  228.         models.CASCADE,
    
  229.         limit_choices_to=today_callable_dict,
    
  230.         related_name="+",
    
  231.     )
    
  232.     has_fooled_today = models.ManyToManyField(
    
  233.         Character, limit_choices_to=today_callable_q, related_name="+"
    
  234.     )
    
  235. 
    
  236.     def __str__(self):
    
  237.         return self.variation
    
  238. 
    
  239. 
    
  240. class Fabric(models.Model):
    
  241.     NG_CHOICES = (
    
  242.         (
    
  243.             "Textured",
    
  244.             (
    
  245.                 ("x", "Horizontal"),
    
  246.                 ("y", "Vertical"),
    
  247.             ),
    
  248.         ),
    
  249.         ("plain", "Smooth"),
    
  250.     )
    
  251.     surface = models.CharField(max_length=20, choices=NG_CHOICES)
    
  252. 
    
  253. 
    
  254. class Person(models.Model):
    
  255.     GENDER_CHOICES = (
    
  256.         (1, "Male"),
    
  257.         (2, "Female"),
    
  258.     )
    
  259.     name = models.CharField(max_length=100)
    
  260.     gender = models.IntegerField(choices=GENDER_CHOICES)
    
  261.     age = models.IntegerField(default=21)
    
  262.     alive = models.BooleanField(default=True)
    
  263. 
    
  264.     def __str__(self):
    
  265.         return self.name
    
  266. 
    
  267. 
    
  268. class Persona(models.Model):
    
  269.     """
    
  270.     A simple persona associated with accounts, to test inlining of related
    
  271.     accounts which inherit from a common accounts class.
    
  272.     """
    
  273. 
    
  274.     name = models.CharField(blank=False, max_length=80)
    
  275. 
    
  276.     def __str__(self):
    
  277.         return self.name
    
  278. 
    
  279. 
    
  280. class Account(models.Model):
    
  281.     """
    
  282.     A simple, generic account encapsulating the information shared by all
    
  283.     types of accounts.
    
  284.     """
    
  285. 
    
  286.     username = models.CharField(blank=False, max_length=80)
    
  287.     persona = models.ForeignKey(Persona, models.CASCADE, related_name="accounts")
    
  288.     servicename = "generic service"
    
  289. 
    
  290.     def __str__(self):
    
  291.         return "%s: %s" % (self.servicename, self.username)
    
  292. 
    
  293. 
    
  294. class FooAccount(Account):
    
  295.     """A service-specific account of type Foo."""
    
  296. 
    
  297.     servicename = "foo"
    
  298. 
    
  299. 
    
  300. class BarAccount(Account):
    
  301.     """A service-specific account of type Bar."""
    
  302. 
    
  303.     servicename = "bar"
    
  304. 
    
  305. 
    
  306. class Subscriber(models.Model):
    
  307.     name = models.CharField(blank=False, max_length=80)
    
  308.     email = models.EmailField(blank=False, max_length=175)
    
  309. 
    
  310.     def __str__(self):
    
  311.         return "%s (%s)" % (self.name, self.email)
    
  312. 
    
  313. 
    
  314. class ExternalSubscriber(Subscriber):
    
  315.     pass
    
  316. 
    
  317. 
    
  318. class OldSubscriber(Subscriber):
    
  319.     pass
    
  320. 
    
  321. 
    
  322. class Media(models.Model):
    
  323.     name = models.CharField(max_length=60)
    
  324. 
    
  325. 
    
  326. class Podcast(Media):
    
  327.     release_date = models.DateField()
    
  328. 
    
  329.     class Meta:
    
  330.         ordering = ("release_date",)  # overridden in PodcastAdmin
    
  331. 
    
  332. 
    
  333. class Vodcast(Media):
    
  334.     media = models.OneToOneField(
    
  335.         Media, models.CASCADE, primary_key=True, parent_link=True
    
  336.     )
    
  337.     released = models.BooleanField(default=False)
    
  338. 
    
  339. 
    
  340. class Parent(models.Model):
    
  341.     name = models.CharField(max_length=128)
    
  342. 
    
  343.     def clean(self):
    
  344.         if self.name == "_invalid":
    
  345.             raise ValidationError("invalid")
    
  346. 
    
  347. 
    
  348. class Child(models.Model):
    
  349.     parent = models.ForeignKey(Parent, models.CASCADE, editable=False)
    
  350.     name = models.CharField(max_length=30, blank=True)
    
  351. 
    
  352.     def clean(self):
    
  353.         if self.name == "_invalid":
    
  354.             raise ValidationError("invalid")
    
  355. 
    
  356. 
    
  357. class PKChild(models.Model):
    
  358.     """
    
  359.     Used to check autocomplete to_field resolution when ForeignKey is PK.
    
  360.     """
    
  361. 
    
  362.     parent = models.ForeignKey(Parent, models.CASCADE, primary_key=True)
    
  363.     name = models.CharField(max_length=128)
    
  364. 
    
  365.     class Meta:
    
  366.         ordering = ["parent"]
    
  367. 
    
  368.     def __str__(self):
    
  369.         return self.name
    
  370. 
    
  371. 
    
  372. class Toy(models.Model):
    
  373.     child = models.ForeignKey(PKChild, models.CASCADE)
    
  374. 
    
  375. 
    
  376. class EmptyModel(models.Model):
    
  377.     def __str__(self):
    
  378.         return "Primary key = %s" % self.id
    
  379. 
    
  380. 
    
  381. temp_storage = FileSystemStorage(tempfile.mkdtemp())
    
  382. 
    
  383. 
    
  384. class Gallery(models.Model):
    
  385.     name = models.CharField(max_length=100)
    
  386. 
    
  387. 
    
  388. class Picture(models.Model):
    
  389.     name = models.CharField(max_length=100)
    
  390.     image = models.FileField(storage=temp_storage, upload_to="test_upload")
    
  391.     gallery = models.ForeignKey(Gallery, models.CASCADE, related_name="pictures")
    
  392. 
    
  393. 
    
  394. class Language(models.Model):
    
  395.     iso = models.CharField(max_length=5, primary_key=True)
    
  396.     name = models.CharField(max_length=50)
    
  397.     english_name = models.CharField(max_length=50)
    
  398.     shortlist = models.BooleanField(default=False)
    
  399. 
    
  400.     def __str__(self):
    
  401.         return self.iso
    
  402. 
    
  403.     class Meta:
    
  404.         ordering = ("iso",)
    
  405. 
    
  406. 
    
  407. # a base class for Recommender and Recommendation
    
  408. class Title(models.Model):
    
  409.     pass
    
  410. 
    
  411. 
    
  412. class TitleTranslation(models.Model):
    
  413.     title = models.ForeignKey(Title, models.CASCADE)
    
  414.     text = models.CharField(max_length=100)
    
  415. 
    
  416. 
    
  417. class Recommender(Title):
    
  418.     pass
    
  419. 
    
  420. 
    
  421. class Recommendation(Title):
    
  422.     the_recommender = models.ForeignKey(Recommender, models.CASCADE)
    
  423. 
    
  424. 
    
  425. class Collector(models.Model):
    
  426.     name = models.CharField(max_length=100)
    
  427. 
    
  428. 
    
  429. class Widget(models.Model):
    
  430.     owner = models.ForeignKey(Collector, models.CASCADE)
    
  431.     name = models.CharField(max_length=100)
    
  432. 
    
  433. 
    
  434. class DooHickey(models.Model):
    
  435.     code = models.CharField(max_length=10, primary_key=True)
    
  436.     owner = models.ForeignKey(Collector, models.CASCADE)
    
  437.     name = models.CharField(max_length=100)
    
  438. 
    
  439. 
    
  440. class Grommet(models.Model):
    
  441.     code = models.AutoField(primary_key=True)
    
  442.     owner = models.ForeignKey(Collector, models.CASCADE)
    
  443.     name = models.CharField(max_length=100)
    
  444. 
    
  445. 
    
  446. class Whatsit(models.Model):
    
  447.     index = models.IntegerField(primary_key=True)
    
  448.     owner = models.ForeignKey(Collector, models.CASCADE)
    
  449.     name = models.CharField(max_length=100)
    
  450. 
    
  451. 
    
  452. class Doodad(models.Model):
    
  453.     name = models.CharField(max_length=100)
    
  454. 
    
  455. 
    
  456. class FancyDoodad(Doodad):
    
  457.     owner = models.ForeignKey(Collector, models.CASCADE)
    
  458.     expensive = models.BooleanField(default=True)
    
  459. 
    
  460. 
    
  461. class Category(models.Model):
    
  462.     collector = models.ForeignKey(Collector, models.CASCADE)
    
  463.     order = models.PositiveIntegerField()
    
  464. 
    
  465.     class Meta:
    
  466.         ordering = ("order",)
    
  467. 
    
  468.     def __str__(self):
    
  469.         return "%s:o%s" % (self.id, self.order)
    
  470. 
    
  471. 
    
  472. def link_posted_default():
    
  473.     return datetime.date.today() - datetime.timedelta(days=7)
    
  474. 
    
  475. 
    
  476. class Link(models.Model):
    
  477.     posted = models.DateField(default=link_posted_default)
    
  478.     url = models.URLField()
    
  479.     post = models.ForeignKey("Post", models.CASCADE)
    
  480.     readonly_link_content = models.TextField()
    
  481. 
    
  482. 
    
  483. class PrePopulatedPost(models.Model):
    
  484.     title = models.CharField(max_length=100)
    
  485.     published = models.BooleanField(default=False)
    
  486.     slug = models.SlugField()
    
  487. 
    
  488. 
    
  489. class PrePopulatedSubPost(models.Model):
    
  490.     post = models.ForeignKey(PrePopulatedPost, models.CASCADE)
    
  491.     subtitle = models.CharField(max_length=100)
    
  492.     subslug = models.SlugField()
    
  493. 
    
  494. 
    
  495. class Post(models.Model):
    
  496.     title = models.CharField(
    
  497.         max_length=100, help_text="Some help text for the title (with Unicode ŠĐĆŽćžšđ)"
    
  498.     )
    
  499.     content = models.TextField(
    
  500.         help_text="Some help text for the content (with Unicode ŠĐĆŽćžšđ)"
    
  501.     )
    
  502.     readonly_content = models.TextField()
    
  503.     posted = models.DateField(
    
  504.         default=datetime.date.today,
    
  505.         help_text="Some help text for the date (with Unicode ŠĐĆŽćžšđ)",
    
  506.     )
    
  507.     public = models.BooleanField(null=True, blank=True)
    
  508. 
    
  509.     def awesomeness_level(self):
    
  510.         return "Very awesome."
    
  511. 
    
  512. 
    
  513. # Proxy model to test overridden fields attrs on Post model so as not to
    
  514. # interfere with other tests.
    
  515. class FieldOverridePost(Post):
    
  516.     class Meta:
    
  517.         proxy = True
    
  518. 
    
  519. 
    
  520. class Gadget(models.Model):
    
  521.     name = models.CharField(max_length=100)
    
  522. 
    
  523.     def __str__(self):
    
  524.         return self.name
    
  525. 
    
  526. 
    
  527. class Villain(models.Model):
    
  528.     name = models.CharField(max_length=100)
    
  529. 
    
  530.     def __str__(self):
    
  531.         return self.name
    
  532. 
    
  533. 
    
  534. class SuperVillain(Villain):
    
  535.     pass
    
  536. 
    
  537. 
    
  538. class FunkyTag(models.Model):
    
  539.     "Because we all know there's only one real use case for GFKs."
    
  540.     name = models.CharField(max_length=25)
    
  541.     content_type = models.ForeignKey(ContentType, models.CASCADE)
    
  542.     object_id = models.PositiveIntegerField()
    
  543.     content_object = GenericForeignKey("content_type", "object_id")
    
  544. 
    
  545.     def __str__(self):
    
  546.         return self.name
    
  547. 
    
  548. 
    
  549. class Plot(models.Model):
    
  550.     name = models.CharField(max_length=100)
    
  551.     team_leader = models.ForeignKey(Villain, models.CASCADE, related_name="lead_plots")
    
  552.     contact = models.ForeignKey(Villain, models.CASCADE, related_name="contact_plots")
    
  553.     tags = GenericRelation(FunkyTag)
    
  554. 
    
  555.     def __str__(self):
    
  556.         return self.name
    
  557. 
    
  558. 
    
  559. class PlotDetails(models.Model):
    
  560.     details = models.CharField(max_length=100)
    
  561.     plot = models.OneToOneField(Plot, models.CASCADE, null=True, blank=True)
    
  562. 
    
  563.     def __str__(self):
    
  564.         return self.details
    
  565. 
    
  566. 
    
  567. class PlotProxy(Plot):
    
  568.     class Meta:
    
  569.         proxy = True
    
  570. 
    
  571. 
    
  572. class SecretHideout(models.Model):
    
  573.     """Secret! Not registered with the admin!"""
    
  574. 
    
  575.     location = models.CharField(max_length=100)
    
  576.     villain = models.ForeignKey(Villain, models.CASCADE)
    
  577. 
    
  578.     def __str__(self):
    
  579.         return self.location
    
  580. 
    
  581. 
    
  582. class SuperSecretHideout(models.Model):
    
  583.     """Secret! Not registered with the admin!"""
    
  584. 
    
  585.     location = models.CharField(max_length=100)
    
  586.     supervillain = models.ForeignKey(SuperVillain, models.CASCADE)
    
  587. 
    
  588.     def __str__(self):
    
  589.         return self.location
    
  590. 
    
  591. 
    
  592. class Bookmark(models.Model):
    
  593.     name = models.CharField(max_length=60)
    
  594.     tag = GenericRelation(FunkyTag, related_query_name="bookmark")
    
  595. 
    
  596.     def __str__(self):
    
  597.         return self.name
    
  598. 
    
  599. 
    
  600. class CyclicOne(models.Model):
    
  601.     name = models.CharField(max_length=25)
    
  602.     two = models.ForeignKey("CyclicTwo", models.CASCADE)
    
  603. 
    
  604.     def __str__(self):
    
  605.         return self.name
    
  606. 
    
  607. 
    
  608. class CyclicTwo(models.Model):
    
  609.     name = models.CharField(max_length=25)
    
  610.     one = models.ForeignKey(CyclicOne, models.CASCADE)
    
  611. 
    
  612.     def __str__(self):
    
  613.         return self.name
    
  614. 
    
  615. 
    
  616. class Topping(models.Model):
    
  617.     name = models.CharField(max_length=20)
    
  618. 
    
  619.     def __str__(self):
    
  620.         return self.name
    
  621. 
    
  622. 
    
  623. class Pizza(models.Model):
    
  624.     name = models.CharField(max_length=20)
    
  625.     toppings = models.ManyToManyField("Topping", related_name="pizzas")
    
  626. 
    
  627. 
    
  628. # Pizza's ModelAdmin has readonly_fields = ['toppings'].
    
  629. # toppings is editable for this model's admin.
    
  630. class ReadablePizza(Pizza):
    
  631.     class Meta:
    
  632.         proxy = True
    
  633. 
    
  634. 
    
  635. # No default permissions are created for this model and both name and toppings
    
  636. # are readonly for this model's admin.
    
  637. class ReadOnlyPizza(Pizza):
    
  638.     class Meta:
    
  639.         proxy = True
    
  640.         default_permissions = ()
    
  641. 
    
  642. 
    
  643. class Album(models.Model):
    
  644.     owner = models.ForeignKey(User, models.SET_NULL, null=True, blank=True)
    
  645.     title = models.CharField(max_length=30)
    
  646. 
    
  647. 
    
  648. class Song(models.Model):
    
  649.     name = models.CharField(max_length=20)
    
  650.     album = models.ForeignKey(Album, on_delete=models.RESTRICT)
    
  651. 
    
  652.     def __str__(self):
    
  653.         return self.name
    
  654. 
    
  655. 
    
  656. class Employee(Person):
    
  657.     code = models.CharField(max_length=20)
    
  658. 
    
  659.     class Meta:
    
  660.         ordering = ["name"]
    
  661. 
    
  662. 
    
  663. class WorkHour(models.Model):
    
  664.     datum = models.DateField()
    
  665.     employee = models.ForeignKey(Employee, models.CASCADE)
    
  666. 
    
  667. 
    
  668. class Manager(Employee):
    
  669.     """
    
  670.     A multi-layer MTI child.
    
  671.     """
    
  672. 
    
  673.     pass
    
  674. 
    
  675. 
    
  676. class Bonus(models.Model):
    
  677.     recipient = models.ForeignKey(Manager, on_delete=models.CASCADE)
    
  678. 
    
  679. 
    
  680. class Question(models.Model):
    
  681.     big_id = models.BigAutoField(primary_key=True)
    
  682.     question = models.CharField(max_length=20)
    
  683.     posted = models.DateField(default=datetime.date.today)
    
  684.     expires = models.DateTimeField(null=True, blank=True)
    
  685.     related_questions = models.ManyToManyField("self")
    
  686.     uuid = models.UUIDField(default=uuid.uuid4, unique=True)
    
  687. 
    
  688.     def __str__(self):
    
  689.         return self.question
    
  690. 
    
  691. 
    
  692. class Answer(models.Model):
    
  693.     question = models.ForeignKey(Question, models.PROTECT)
    
  694.     question_with_to_field = models.ForeignKey(
    
  695.         Question,
    
  696.         models.SET_NULL,
    
  697.         blank=True,
    
  698.         null=True,
    
  699.         to_field="uuid",
    
  700.         related_name="uuid_answers",
    
  701.         limit_choices_to=~models.Q(question__istartswith="not"),
    
  702.     )
    
  703.     related_answers = models.ManyToManyField("self")
    
  704.     answer = models.CharField(max_length=20)
    
  705. 
    
  706.     def __str__(self):
    
  707.         return self.answer
    
  708. 
    
  709. 
    
  710. class Answer2(Answer):
    
  711.     class Meta:
    
  712.         proxy = True
    
  713. 
    
  714. 
    
  715. class Reservation(models.Model):
    
  716.     start_date = models.DateTimeField()
    
  717.     price = models.IntegerField()
    
  718. 
    
  719. 
    
  720. class FoodDelivery(models.Model):
    
  721.     DRIVER_CHOICES = (
    
  722.         ("bill", "Bill G"),
    
  723.         ("steve", "Steve J"),
    
  724.     )
    
  725.     RESTAURANT_CHOICES = (
    
  726.         ("indian", "A Taste of India"),
    
  727.         ("thai", "Thai Pography"),
    
  728.         ("pizza", "Pizza Mama"),
    
  729.     )
    
  730.     reference = models.CharField(max_length=100)
    
  731.     driver = models.CharField(max_length=100, choices=DRIVER_CHOICES, blank=True)
    
  732.     restaurant = models.CharField(
    
  733.         max_length=100, choices=RESTAURANT_CHOICES, blank=True
    
  734.     )
    
  735. 
    
  736.     class Meta:
    
  737.         unique_together = (("driver", "restaurant"),)
    
  738. 
    
  739. 
    
  740. class CoverLetter(models.Model):
    
  741.     author = models.CharField(max_length=30)
    
  742.     date_written = models.DateField(null=True, blank=True)
    
  743. 
    
  744.     def __str__(self):
    
  745.         return self.author
    
  746. 
    
  747. 
    
  748. class Paper(models.Model):
    
  749.     title = models.CharField(max_length=30)
    
  750.     author = models.CharField(max_length=30, blank=True, null=True)
    
  751. 
    
  752. 
    
  753. class ShortMessage(models.Model):
    
  754.     content = models.CharField(max_length=140)
    
  755.     timestamp = models.DateTimeField(null=True, blank=True)
    
  756. 
    
  757. 
    
  758. class Telegram(models.Model):
    
  759.     title = models.CharField(max_length=30)
    
  760.     date_sent = models.DateField(null=True, blank=True)
    
  761. 
    
  762.     def __str__(self):
    
  763.         return self.title
    
  764. 
    
  765. 
    
  766. class Story(models.Model):
    
  767.     title = models.CharField(max_length=100)
    
  768.     content = models.TextField()
    
  769. 
    
  770. 
    
  771. class OtherStory(models.Model):
    
  772.     title = models.CharField(max_length=100)
    
  773.     content = models.TextField()
    
  774. 
    
  775. 
    
  776. class ComplexSortedPerson(models.Model):
    
  777.     name = models.CharField(max_length=100)
    
  778.     age = models.PositiveIntegerField()
    
  779.     is_employee = models.BooleanField(null=True)
    
  780. 
    
  781. 
    
  782. class PluggableSearchPerson(models.Model):
    
  783.     name = models.CharField(max_length=100)
    
  784.     age = models.PositiveIntegerField()
    
  785. 
    
  786. 
    
  787. class PrePopulatedPostLargeSlug(models.Model):
    
  788.     """
    
  789.     Regression test for #15938: a large max_length for the slugfield must not
    
  790.     be localized in prepopulated_fields_js.html or it might end up breaking
    
  791.     the JavaScript (ie, using THOUSAND_SEPARATOR ends up with maxLength=1,000)
    
  792.     """
    
  793. 
    
  794.     title = models.CharField(max_length=100)
    
  795.     published = models.BooleanField(default=False)
    
  796.     # `db_index=False` because MySQL cannot index large CharField (#21196).
    
  797.     slug = models.SlugField(max_length=1000, db_index=False)
    
  798. 
    
  799. 
    
  800. class AdminOrderedField(models.Model):
    
  801.     order = models.IntegerField()
    
  802.     stuff = models.CharField(max_length=200)
    
  803. 
    
  804. 
    
  805. class AdminOrderedModelMethod(models.Model):
    
  806.     order = models.IntegerField()
    
  807.     stuff = models.CharField(max_length=200)
    
  808. 
    
  809.     @admin.display(ordering="order")
    
  810.     def some_order(self):
    
  811.         return self.order
    
  812. 
    
  813. 
    
  814. class AdminOrderedAdminMethod(models.Model):
    
  815.     order = models.IntegerField()
    
  816.     stuff = models.CharField(max_length=200)
    
  817. 
    
  818. 
    
  819. class AdminOrderedCallable(models.Model):
    
  820.     order = models.IntegerField()
    
  821.     stuff = models.CharField(max_length=200)
    
  822. 
    
  823. 
    
  824. class Report(models.Model):
    
  825.     title = models.CharField(max_length=100)
    
  826. 
    
  827.     def __str__(self):
    
  828.         return self.title
    
  829. 
    
  830. 
    
  831. class MainPrepopulated(models.Model):
    
  832.     name = models.CharField(max_length=100)
    
  833.     pubdate = models.DateField()
    
  834.     status = models.CharField(
    
  835.         max_length=20,
    
  836.         choices=(("option one", "Option One"), ("option two", "Option Two")),
    
  837.     )
    
  838.     slug1 = models.SlugField(blank=True)
    
  839.     slug2 = models.SlugField(blank=True)
    
  840.     slug3 = models.SlugField(blank=True, allow_unicode=True)
    
  841. 
    
  842. 
    
  843. class RelatedPrepopulated(models.Model):
    
  844.     parent = models.ForeignKey(MainPrepopulated, models.CASCADE)
    
  845.     name = models.CharField(max_length=75)
    
  846.     fk = models.ForeignKey("self", models.CASCADE, blank=True, null=True)
    
  847.     m2m = models.ManyToManyField("self", blank=True)
    
  848.     pubdate = models.DateField()
    
  849.     status = models.CharField(
    
  850.         max_length=20,
    
  851.         choices=(("option one", "Option One"), ("option two", "Option Two")),
    
  852.     )
    
  853.     slug1 = models.SlugField(max_length=50)
    
  854.     slug2 = models.SlugField(max_length=60)
    
  855. 
    
  856. 
    
  857. class UnorderedObject(models.Model):
    
  858.     """
    
  859.     Model without any defined `Meta.ordering`.
    
  860.     Refs #16819.
    
  861.     """
    
  862. 
    
  863.     name = models.CharField(max_length=255)
    
  864.     bool = models.BooleanField(default=True)
    
  865. 
    
  866. 
    
  867. class UndeletableObject(models.Model):
    
  868.     """
    
  869.     Model whose show_delete in admin change_view has been disabled
    
  870.     Refs #10057.
    
  871.     """
    
  872. 
    
  873.     name = models.CharField(max_length=255)
    
  874. 
    
  875. 
    
  876. class UnchangeableObject(models.Model):
    
  877.     """
    
  878.     Model whose change_view is disabled in admin
    
  879.     Refs #20640.
    
  880.     """
    
  881. 
    
  882. 
    
  883. class UserMessenger(models.Model):
    
  884.     """
    
  885.     Dummy class for testing message_user functions on ModelAdmin
    
  886.     """
    
  887. 
    
  888. 
    
  889. class Simple(models.Model):
    
  890.     """
    
  891.     Simple model with nothing on it for use in testing
    
  892.     """
    
  893. 
    
  894. 
    
  895. class Choice(models.Model):
    
  896.     choice = models.IntegerField(
    
  897.         blank=True,
    
  898.         null=True,
    
  899.         choices=((1, "Yes"), (0, "No"), (None, "No opinion")),
    
  900.     )
    
  901. 
    
  902. 
    
  903. class ParentWithDependentChildren(models.Model):
    
  904.     """
    
  905.     Issue #20522
    
  906.     Model where the validation of child foreign-key relationships depends
    
  907.     on validation of the parent
    
  908.     """
    
  909. 
    
  910.     some_required_info = models.PositiveIntegerField()
    
  911.     family_name = models.CharField(max_length=255, blank=False)
    
  912. 
    
  913. 
    
  914. class DependentChild(models.Model):
    
  915.     """
    
  916.     Issue #20522
    
  917.     Model that depends on validation of the parent class for one of its
    
  918.     fields to validate during clean
    
  919.     """
    
  920. 
    
  921.     parent = models.ForeignKey(ParentWithDependentChildren, models.CASCADE)
    
  922.     family_name = models.CharField(max_length=255)
    
  923. 
    
  924. 
    
  925. class _Manager(models.Manager):
    
  926.     def get_queryset(self):
    
  927.         return super().get_queryset().filter(pk__gt=1)
    
  928. 
    
  929. 
    
  930. class FilteredManager(models.Model):
    
  931.     def __str__(self):
    
  932.         return "PK=%d" % self.pk
    
  933. 
    
  934.     pk_gt_1 = _Manager()
    
  935.     objects = models.Manager()
    
  936. 
    
  937. 
    
  938. class EmptyModelVisible(models.Model):
    
  939.     """See ticket #11277."""
    
  940. 
    
  941. 
    
  942. class EmptyModelHidden(models.Model):
    
  943.     """See ticket #11277."""
    
  944. 
    
  945. 
    
  946. class EmptyModelMixin(models.Model):
    
  947.     """See ticket #11277."""
    
  948. 
    
  949. 
    
  950. class State(models.Model):
    
  951.     name = models.CharField(max_length=100, verbose_name="State verbose_name")
    
  952. 
    
  953. 
    
  954. class City(models.Model):
    
  955.     state = models.ForeignKey(State, models.CASCADE)
    
  956.     name = models.CharField(max_length=100, verbose_name="City verbose_name")
    
  957. 
    
  958.     def get_absolute_url(self):
    
  959.         return "/dummy/%s/" % self.pk
    
  960. 
    
  961. 
    
  962. class Restaurant(models.Model):
    
  963.     city = models.ForeignKey(City, models.CASCADE)
    
  964.     name = models.CharField(max_length=100)
    
  965. 
    
  966.     def get_absolute_url(self):
    
  967.         return "/dummy/%s/" % self.pk
    
  968. 
    
  969. 
    
  970. class Worker(models.Model):
    
  971.     work_at = models.ForeignKey(Restaurant, models.CASCADE)
    
  972.     name = models.CharField(max_length=50)
    
  973.     surname = models.CharField(max_length=50)
    
  974. 
    
  975. 
    
  976. # Models for #23329
    
  977. class ReferencedByParent(models.Model):
    
  978.     name = models.CharField(max_length=20, unique=True)
    
  979. 
    
  980. 
    
  981. class ParentWithFK(models.Model):
    
  982.     fk = models.ForeignKey(
    
  983.         ReferencedByParent,
    
  984.         models.CASCADE,
    
  985.         to_field="name",
    
  986.         related_name="hidden+",
    
  987.     )
    
  988. 
    
  989. 
    
  990. class ChildOfReferer(ParentWithFK):
    
  991.     pass
    
  992. 
    
  993. 
    
  994. # Models for #23431
    
  995. class InlineReferer(models.Model):
    
  996.     pass
    
  997. 
    
  998. 
    
  999. class ReferencedByInline(models.Model):
    
  1000.     name = models.CharField(max_length=20, unique=True)
    
  1001. 
    
  1002. 
    
  1003. class InlineReference(models.Model):
    
  1004.     referer = models.ForeignKey(InlineReferer, models.CASCADE)
    
  1005.     fk = models.ForeignKey(
    
  1006.         ReferencedByInline,
    
  1007.         models.CASCADE,
    
  1008.         to_field="name",
    
  1009.         related_name="hidden+",
    
  1010.     )
    
  1011. 
    
  1012. 
    
  1013. class Recipe(models.Model):
    
  1014.     rname = models.CharField(max_length=20, unique=True)
    
  1015. 
    
  1016. 
    
  1017. class Ingredient(models.Model):
    
  1018.     iname = models.CharField(max_length=20, unique=True)
    
  1019.     recipes = models.ManyToManyField(Recipe, through="RecipeIngredient")
    
  1020. 
    
  1021. 
    
  1022. class RecipeIngredient(models.Model):
    
  1023.     ingredient = models.ForeignKey(Ingredient, models.CASCADE, to_field="iname")
    
  1024.     recipe = models.ForeignKey(Recipe, models.CASCADE, to_field="rname")
    
  1025. 
    
  1026. 
    
  1027. # Model for #23839
    
  1028. class NotReferenced(models.Model):
    
  1029.     # Don't point any FK at this model.
    
  1030.     pass
    
  1031. 
    
  1032. 
    
  1033. # Models for #23934
    
  1034. class ExplicitlyProvidedPK(models.Model):
    
  1035.     name = models.IntegerField(primary_key=True)
    
  1036. 
    
  1037. 
    
  1038. class ImplicitlyGeneratedPK(models.Model):
    
  1039.     name = models.IntegerField(unique=True)
    
  1040. 
    
  1041. 
    
  1042. # Models for #25622
    
  1043. class ReferencedByGenRel(models.Model):
    
  1044.     content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    
  1045.     object_id = models.PositiveIntegerField()
    
  1046.     content_object = GenericForeignKey("content_type", "object_id")
    
  1047. 
    
  1048. 
    
  1049. class GenRelReference(models.Model):
    
  1050.     references = GenericRelation(ReferencedByGenRel)
    
  1051. 
    
  1052. 
    
  1053. class ParentWithUUIDPK(models.Model):
    
  1054.     id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    
  1055.     title = models.CharField(max_length=100)
    
  1056. 
    
  1057.     def __str__(self):
    
  1058.         return str(self.id)
    
  1059. 
    
  1060. 
    
  1061. class RelatedWithUUIDPKModel(models.Model):
    
  1062.     parent = models.ForeignKey(
    
  1063.         ParentWithUUIDPK, on_delete=models.SET_NULL, null=True, blank=True
    
  1064.     )
    
  1065. 
    
  1066. 
    
  1067. class Author(models.Model):
    
  1068.     pass
    
  1069. 
    
  1070. 
    
  1071. class Authorship(models.Model):
    
  1072.     book = models.ForeignKey(Book, models.CASCADE)
    
  1073.     author = models.ForeignKey(Author, models.CASCADE)
    
  1074. 
    
  1075. 
    
  1076. class UserProxy(User):
    
  1077.     """Proxy a model with a different app_label."""
    
  1078. 
    
  1079.     class Meta:
    
  1080.         proxy = True
    
  1081. 
    
  1082. 
    
  1083. class ReadOnlyRelatedField(models.Model):
    
  1084.     chapter = models.ForeignKey(Chapter, models.CASCADE)
    
  1085.     language = models.ForeignKey(Language, models.CASCADE)
    
  1086.     user = models.ForeignKey(User, models.CASCADE)
    
  1087. 
    
  1088. 
    
  1089. class Héllo(models.Model):
    
  1090.     pass
    
  1091. 
    
  1092. 
    
  1093. class Box(models.Model):
    
  1094.     title = models.CharField(max_length=100)
    
  1095.     next_box = models.ForeignKey(
    
  1096.         "self", null=True, on_delete=models.SET_NULL, blank=True
    
  1097.     )
    
  1098.     next_box = models.ForeignKey(
    
  1099.         "self", null=True, on_delete=models.SET_NULL, blank=True
    
  1100.     )
    
  1101. 
    
  1102. 
    
  1103. class Country(models.Model):
    
  1104.     NORTH_AMERICA = "North America"
    
  1105.     SOUTH_AMERICA = "South America"
    
  1106.     EUROPE = "Europe"
    
  1107.     ASIA = "Asia"
    
  1108.     OCEANIA = "Oceania"
    
  1109.     ANTARCTICA = "Antarctica"
    
  1110. 
    
  1111.     CONTINENT_CHOICES = [
    
  1112.         (NORTH_AMERICA, NORTH_AMERICA),
    
  1113.         (SOUTH_AMERICA, SOUTH_AMERICA),
    
  1114.         (EUROPE, EUROPE),
    
  1115.         (ASIA, ASIA),
    
  1116.         (OCEANIA, OCEANIA),
    
  1117.         (ANTARCTICA, ANTARCTICA),
    
  1118.     ]
    
  1119.     name = models.CharField(max_length=80)
    
  1120.     continent = models.CharField(max_length=13, choices=CONTINENT_CHOICES)
    
  1121. 
    
  1122.     def __str__(self):
    
  1123.         return self.name
    
  1124. 
    
  1125. 
    
  1126. class Traveler(models.Model):
    
  1127.     born_country = models.ForeignKey(Country, models.CASCADE)
    
  1128.     living_country = models.ForeignKey(
    
  1129.         Country, models.CASCADE, related_name="living_country_set"
    
  1130.     )
    
  1131.     favorite_country_to_vacation = models.ForeignKey(
    
  1132.         Country,
    
  1133.         models.CASCADE,
    
  1134.         related_name="favorite_country_to_vacation_set",
    
  1135.         limit_choices_to={"continent": Country.ASIA},
    
  1136.     )