1. """
    
  2. Various complex queries that have been problematic in the past.
    
  3. """
    
  4. from django.db import models
    
  5. from django.db.models.functions import Now
    
  6. 
    
  7. 
    
  8. class DumbCategory(models.Model):
    
  9.     pass
    
  10. 
    
  11. 
    
  12. class ProxyCategory(DumbCategory):
    
  13.     class Meta:
    
  14.         proxy = True
    
  15. 
    
  16. 
    
  17. class NamedCategory(DumbCategory):
    
  18.     name = models.CharField(max_length=10)
    
  19. 
    
  20.     def __str__(self):
    
  21.         return self.name
    
  22. 
    
  23. 
    
  24. class Tag(models.Model):
    
  25.     name = models.CharField(max_length=10)
    
  26.     parent = models.ForeignKey(
    
  27.         "self",
    
  28.         models.SET_NULL,
    
  29.         blank=True,
    
  30.         null=True,
    
  31.         related_name="children",
    
  32.     )
    
  33.     category = models.ForeignKey(
    
  34.         NamedCategory, models.SET_NULL, null=True, default=None
    
  35.     )
    
  36. 
    
  37.     class Meta:
    
  38.         ordering = ["name"]
    
  39. 
    
  40.     def __str__(self):
    
  41.         return self.name
    
  42. 
    
  43. 
    
  44. class Note(models.Model):
    
  45.     note = models.CharField(max_length=100)
    
  46.     misc = models.CharField(max_length=25)
    
  47.     tag = models.ForeignKey(Tag, models.SET_NULL, blank=True, null=True)
    
  48.     negate = models.BooleanField(default=True)
    
  49. 
    
  50.     class Meta:
    
  51.         ordering = ["note"]
    
  52. 
    
  53.     def __str__(self):
    
  54.         return self.note
    
  55. 
    
  56. 
    
  57. class Annotation(models.Model):
    
  58.     name = models.CharField(max_length=10)
    
  59.     tag = models.ForeignKey(Tag, models.CASCADE)
    
  60.     notes = models.ManyToManyField(Note)
    
  61. 
    
  62.     def __str__(self):
    
  63.         return self.name
    
  64. 
    
  65. 
    
  66. class DateTimePK(models.Model):
    
  67.     date = models.DateTimeField(primary_key=True, auto_now_add=True)
    
  68. 
    
  69. 
    
  70. class ExtraInfo(models.Model):
    
  71.     info = models.CharField(max_length=100)
    
  72.     note = models.ForeignKey(Note, models.CASCADE, null=True)
    
  73.     value = models.IntegerField(null=True)
    
  74.     date = models.ForeignKey(DateTimePK, models.SET_NULL, null=True)
    
  75.     filterable = models.BooleanField(default=True)
    
  76. 
    
  77.     class Meta:
    
  78.         ordering = ["info"]
    
  79. 
    
  80.     def __str__(self):
    
  81.         return self.info
    
  82. 
    
  83. 
    
  84. class Author(models.Model):
    
  85.     name = models.CharField(max_length=10)
    
  86.     num = models.IntegerField(unique=True)
    
  87.     extra = models.ForeignKey(ExtraInfo, models.CASCADE)
    
  88. 
    
  89.     class Meta:
    
  90.         ordering = ["name"]
    
  91. 
    
  92.     def __str__(self):
    
  93.         return self.name
    
  94. 
    
  95. 
    
  96. class Item(models.Model):
    
  97.     name = models.CharField(max_length=10)
    
  98.     created = models.DateTimeField()
    
  99.     modified = models.DateTimeField(blank=True, null=True)
    
  100.     tags = models.ManyToManyField(Tag, blank=True)
    
  101.     creator = models.ForeignKey(Author, models.CASCADE)
    
  102.     note = models.ForeignKey(Note, models.CASCADE)
    
  103. 
    
  104.     class Meta:
    
  105.         ordering = ["-note", "name"]
    
  106. 
    
  107.     def __str__(self):
    
  108.         return self.name
    
  109. 
    
  110. 
    
  111. class Report(models.Model):
    
  112.     name = models.CharField(max_length=10)
    
  113.     creator = models.ForeignKey(Author, models.SET_NULL, to_field="num", null=True)
    
  114. 
    
  115.     def __str__(self):
    
  116.         return self.name
    
  117. 
    
  118. 
    
  119. class ReportComment(models.Model):
    
  120.     report = models.ForeignKey(Report, models.CASCADE)
    
  121. 
    
  122. 
    
  123. class Ranking(models.Model):
    
  124.     rank = models.IntegerField()
    
  125.     author = models.ForeignKey(Author, models.CASCADE)
    
  126. 
    
  127.     class Meta:
    
  128.         # A complex ordering specification. Should stress the system a bit.
    
  129.         ordering = ("author__extra__note", "author__name", "rank")
    
  130. 
    
  131.     def __str__(self):
    
  132.         return "%d: %s" % (self.rank, self.author.name)
    
  133. 
    
  134. 
    
  135. class Cover(models.Model):
    
  136.     title = models.CharField(max_length=50)
    
  137.     item = models.ForeignKey(Item, models.CASCADE)
    
  138. 
    
  139.     class Meta:
    
  140.         ordering = ["item"]
    
  141. 
    
  142.     def __str__(self):
    
  143.         return self.title
    
  144. 
    
  145. 
    
  146. class Number(models.Model):
    
  147.     num = models.IntegerField()
    
  148.     other_num = models.IntegerField(null=True)
    
  149.     another_num = models.IntegerField(null=True)
    
  150. 
    
  151.     def __str__(self):
    
  152.         return str(self.num)
    
  153. 
    
  154. 
    
  155. # Symmetrical m2m field with a normal field using the reverse accessor name
    
  156. # ("valid").
    
  157. 
    
  158. 
    
  159. class Valid(models.Model):
    
  160.     valid = models.CharField(max_length=10)
    
  161.     parent = models.ManyToManyField("self")
    
  162. 
    
  163.     class Meta:
    
  164.         ordering = ["valid"]
    
  165. 
    
  166. 
    
  167. # Some funky cross-linked models for testing a couple of infinite recursion
    
  168. # cases.
    
  169. 
    
  170. 
    
  171. class X(models.Model):
    
  172.     y = models.ForeignKey("Y", models.CASCADE)
    
  173. 
    
  174. 
    
  175. class Y(models.Model):
    
  176.     x1 = models.ForeignKey(X, models.CASCADE, related_name="y1")
    
  177. 
    
  178. 
    
  179. # Some models with a cycle in the default ordering. This would be bad if we
    
  180. # didn't catch the infinite loop.
    
  181. 
    
  182. 
    
  183. class LoopX(models.Model):
    
  184.     y = models.ForeignKey("LoopY", models.CASCADE)
    
  185. 
    
  186.     class Meta:
    
  187.         ordering = ["y"]
    
  188. 
    
  189. 
    
  190. class LoopY(models.Model):
    
  191.     x = models.ForeignKey(LoopX, models.CASCADE)
    
  192. 
    
  193.     class Meta:
    
  194.         ordering = ["x"]
    
  195. 
    
  196. 
    
  197. class LoopZ(models.Model):
    
  198.     z = models.ForeignKey("self", models.CASCADE)
    
  199. 
    
  200.     class Meta:
    
  201.         ordering = ["z"]
    
  202. 
    
  203. 
    
  204. # A model and custom default manager combination.
    
  205. 
    
  206. 
    
  207. class CustomManager(models.Manager):
    
  208.     def get_queryset(self):
    
  209.         qs = super().get_queryset()
    
  210.         return qs.filter(public=True, tag__name="t1")
    
  211. 
    
  212. 
    
  213. class ManagedModel(models.Model):
    
  214.     data = models.CharField(max_length=10)
    
  215.     tag = models.ForeignKey(Tag, models.CASCADE)
    
  216.     public = models.BooleanField(default=True)
    
  217. 
    
  218.     objects = CustomManager()
    
  219.     normal_manager = models.Manager()
    
  220. 
    
  221.     def __str__(self):
    
  222.         return self.data
    
  223. 
    
  224. 
    
  225. # An inter-related setup with multiple paths from Child to Detail.
    
  226. 
    
  227. 
    
  228. class Detail(models.Model):
    
  229.     data = models.CharField(max_length=10)
    
  230. 
    
  231. 
    
  232. class MemberManager(models.Manager):
    
  233.     def get_queryset(self):
    
  234.         return super().get_queryset().select_related("details")
    
  235. 
    
  236. 
    
  237. class Member(models.Model):
    
  238.     name = models.CharField(max_length=10)
    
  239.     details = models.OneToOneField(Detail, models.CASCADE, primary_key=True)
    
  240. 
    
  241.     objects = MemberManager()
    
  242. 
    
  243. 
    
  244. class Child(models.Model):
    
  245.     person = models.OneToOneField(Member, models.CASCADE, primary_key=True)
    
  246.     parent = models.ForeignKey(Member, models.CASCADE, related_name="children")
    
  247. 
    
  248. 
    
  249. # Custom primary keys interfered with ordering in the past.
    
  250. 
    
  251. 
    
  252. class CustomPk(models.Model):
    
  253.     name = models.CharField(max_length=10, primary_key=True)
    
  254.     extra = models.CharField(max_length=10)
    
  255. 
    
  256.     class Meta:
    
  257.         ordering = ["name", "extra"]
    
  258. 
    
  259. 
    
  260. class Related(models.Model):
    
  261.     custom = models.ForeignKey(CustomPk, models.CASCADE, null=True)
    
  262. 
    
  263. 
    
  264. class CustomPkTag(models.Model):
    
  265.     id = models.CharField(max_length=20, primary_key=True)
    
  266.     custom_pk = models.ManyToManyField(CustomPk)
    
  267.     tag = models.CharField(max_length=20)
    
  268. 
    
  269. 
    
  270. # An inter-related setup with a model subclass that has a nullable
    
  271. # path to another model, and a return path from that model.
    
  272. 
    
  273. 
    
  274. class Celebrity(models.Model):
    
  275.     name = models.CharField("Name", max_length=20)
    
  276.     greatest_fan = models.ForeignKey("Fan", models.SET_NULL, null=True, unique=True)
    
  277. 
    
  278.     def __str__(self):
    
  279.         return self.name
    
  280. 
    
  281. 
    
  282. class TvChef(Celebrity):
    
  283.     pass
    
  284. 
    
  285. 
    
  286. class Fan(models.Model):
    
  287.     fan_of = models.ForeignKey(Celebrity, models.CASCADE)
    
  288. 
    
  289. 
    
  290. # Multiple foreign keys
    
  291. 
    
  292. 
    
  293. class LeafA(models.Model):
    
  294.     data = models.CharField(max_length=10)
    
  295. 
    
  296.     def __str__(self):
    
  297.         return self.data
    
  298. 
    
  299. 
    
  300. class LeafB(models.Model):
    
  301.     data = models.CharField(max_length=10)
    
  302. 
    
  303. 
    
  304. class Join(models.Model):
    
  305.     a = models.ForeignKey(LeafA, models.CASCADE)
    
  306.     b = models.ForeignKey(LeafB, models.CASCADE)
    
  307. 
    
  308. 
    
  309. class ReservedName(models.Model):
    
  310.     name = models.CharField(max_length=20)
    
  311.     order = models.IntegerField()
    
  312. 
    
  313.     def __str__(self):
    
  314.         return self.name
    
  315. 
    
  316. 
    
  317. # A simpler shared-foreign-key setup that can expose some problems.
    
  318. 
    
  319. 
    
  320. class SharedConnection(models.Model):
    
  321.     data = models.CharField(max_length=10)
    
  322. 
    
  323.     def __str__(self):
    
  324.         return self.data
    
  325. 
    
  326. 
    
  327. class PointerA(models.Model):
    
  328.     connection = models.ForeignKey(SharedConnection, models.CASCADE)
    
  329. 
    
  330. 
    
  331. class PointerB(models.Model):
    
  332.     connection = models.ForeignKey(SharedConnection, models.CASCADE)
    
  333. 
    
  334. 
    
  335. # Multi-layer ordering
    
  336. 
    
  337. 
    
  338. class SingleObject(models.Model):
    
  339.     name = models.CharField(max_length=10)
    
  340. 
    
  341.     class Meta:
    
  342.         ordering = ["name"]
    
  343. 
    
  344.     def __str__(self):
    
  345.         return self.name
    
  346. 
    
  347. 
    
  348. class RelatedObject(models.Model):
    
  349.     single = models.ForeignKey(SingleObject, models.SET_NULL, null=True)
    
  350.     f = models.IntegerField(null=True)
    
  351. 
    
  352.     class Meta:
    
  353.         ordering = ["single"]
    
  354. 
    
  355. 
    
  356. class Plaything(models.Model):
    
  357.     name = models.CharField(max_length=10)
    
  358.     others = models.ForeignKey(RelatedObject, models.SET_NULL, null=True)
    
  359. 
    
  360.     class Meta:
    
  361.         ordering = ["others"]
    
  362. 
    
  363.     def __str__(self):
    
  364.         return self.name
    
  365. 
    
  366. 
    
  367. class Article(models.Model):
    
  368.     name = models.CharField(max_length=20)
    
  369.     created = models.DateTimeField()
    
  370. 
    
  371.     def __str__(self):
    
  372.         return self.name
    
  373. 
    
  374. 
    
  375. class Food(models.Model):
    
  376.     name = models.CharField(max_length=20, unique=True)
    
  377. 
    
  378.     def __str__(self):
    
  379.         return self.name
    
  380. 
    
  381. 
    
  382. class Eaten(models.Model):
    
  383.     food = models.ForeignKey(Food, models.SET_NULL, to_field="name", null=True)
    
  384.     meal = models.CharField(max_length=20)
    
  385. 
    
  386.     def __str__(self):
    
  387.         return "%s at %s" % (self.food, self.meal)
    
  388. 
    
  389. 
    
  390. class Node(models.Model):
    
  391.     num = models.IntegerField(unique=True)
    
  392.     parent = models.ForeignKey("self", models.SET_NULL, to_field="num", null=True)
    
  393. 
    
  394.     def __str__(self):
    
  395.         return str(self.num)
    
  396. 
    
  397. 
    
  398. # Bug #12252
    
  399. 
    
  400. 
    
  401. class ObjectA(models.Model):
    
  402.     name = models.CharField(max_length=50)
    
  403. 
    
  404.     def __str__(self):
    
  405.         return self.name
    
  406. 
    
  407.     def __iter__(self):
    
  408.         # Ticket #23721
    
  409.         assert False, "type checking should happen without calling model __iter__"
    
  410. 
    
  411. 
    
  412. class ProxyObjectA(ObjectA):
    
  413.     class Meta:
    
  414.         proxy = True
    
  415. 
    
  416. 
    
  417. class ChildObjectA(ObjectA):
    
  418.     pass
    
  419. 
    
  420. 
    
  421. class ObjectB(models.Model):
    
  422.     name = models.CharField(max_length=50)
    
  423.     objecta = models.ForeignKey(ObjectA, models.CASCADE)
    
  424.     num = models.PositiveIntegerField()
    
  425. 
    
  426.     def __str__(self):
    
  427.         return self.name
    
  428. 
    
  429. 
    
  430. class ProxyObjectB(ObjectB):
    
  431.     class Meta:
    
  432.         proxy = True
    
  433. 
    
  434. 
    
  435. class ObjectC(models.Model):
    
  436.     name = models.CharField(max_length=50)
    
  437.     objecta = models.ForeignKey(ObjectA, models.SET_NULL, null=True)
    
  438.     objectb = models.ForeignKey(ObjectB, models.SET_NULL, null=True)
    
  439.     childobjecta = models.ForeignKey(
    
  440.         ChildObjectA, models.SET_NULL, null=True, related_name="ca_pk"
    
  441.     )
    
  442. 
    
  443.     def __str__(self):
    
  444.         return self.name
    
  445. 
    
  446. 
    
  447. class SimpleCategory(models.Model):
    
  448.     name = models.CharField(max_length=25)
    
  449. 
    
  450.     def __str__(self):
    
  451.         return self.name
    
  452. 
    
  453. 
    
  454. class SpecialCategory(SimpleCategory):
    
  455.     special_name = models.CharField(max_length=35)
    
  456. 
    
  457.     def __str__(self):
    
  458.         return self.name + " " + self.special_name
    
  459. 
    
  460. 
    
  461. class CategoryItem(models.Model):
    
  462.     category = models.ForeignKey(SimpleCategory, models.CASCADE)
    
  463. 
    
  464.     def __str__(self):
    
  465.         return "category item: " + str(self.category)
    
  466. 
    
  467. 
    
  468. class MixedCaseFieldCategoryItem(models.Model):
    
  469.     CaTeGoRy = models.ForeignKey(SimpleCategory, models.CASCADE)
    
  470. 
    
  471. 
    
  472. class MixedCaseDbColumnCategoryItem(models.Model):
    
  473.     category = models.ForeignKey(
    
  474.         SimpleCategory, models.CASCADE, db_column="CaTeGoRy_Id"
    
  475.     )
    
  476. 
    
  477. 
    
  478. class OneToOneCategory(models.Model):
    
  479.     new_name = models.CharField(max_length=15)
    
  480.     category = models.OneToOneField(SimpleCategory, models.CASCADE)
    
  481. 
    
  482.     def __str__(self):
    
  483.         return "one2one " + self.new_name
    
  484. 
    
  485. 
    
  486. class CategoryRelationship(models.Model):
    
  487.     first = models.ForeignKey(SimpleCategory, models.CASCADE, related_name="first_rel")
    
  488.     second = models.ForeignKey(
    
  489.         SimpleCategory, models.CASCADE, related_name="second_rel"
    
  490.     )
    
  491. 
    
  492. 
    
  493. class CommonMixedCaseForeignKeys(models.Model):
    
  494.     category = models.ForeignKey(CategoryItem, models.CASCADE)
    
  495.     mixed_case_field_category = models.ForeignKey(
    
  496.         MixedCaseFieldCategoryItem, models.CASCADE
    
  497.     )
    
  498.     mixed_case_db_column_category = models.ForeignKey(
    
  499.         MixedCaseDbColumnCategoryItem, models.CASCADE
    
  500.     )
    
  501. 
    
  502. 
    
  503. class NullableName(models.Model):
    
  504.     name = models.CharField(max_length=20, null=True)
    
  505. 
    
  506.     class Meta:
    
  507.         ordering = ["id"]
    
  508. 
    
  509. 
    
  510. class ModelD(models.Model):
    
  511.     name = models.TextField()
    
  512. 
    
  513. 
    
  514. class ModelC(models.Model):
    
  515.     name = models.TextField()
    
  516. 
    
  517. 
    
  518. class ModelB(models.Model):
    
  519.     name = models.TextField()
    
  520.     c = models.ForeignKey(ModelC, models.CASCADE)
    
  521. 
    
  522. 
    
  523. class ModelA(models.Model):
    
  524.     name = models.TextField()
    
  525.     b = models.ForeignKey(ModelB, models.SET_NULL, null=True)
    
  526.     d = models.ForeignKey(ModelD, models.CASCADE)
    
  527. 
    
  528. 
    
  529. class Job(models.Model):
    
  530.     name = models.CharField(max_length=20, unique=True)
    
  531. 
    
  532.     def __str__(self):
    
  533.         return self.name
    
  534. 
    
  535. 
    
  536. class JobResponsibilities(models.Model):
    
  537.     job = models.ForeignKey(Job, models.CASCADE, to_field="name")
    
  538.     responsibility = models.ForeignKey(
    
  539.         "Responsibility", models.CASCADE, to_field="description"
    
  540.     )
    
  541. 
    
  542. 
    
  543. class Responsibility(models.Model):
    
  544.     description = models.CharField(max_length=20, unique=True)
    
  545.     jobs = models.ManyToManyField(
    
  546.         Job, through=JobResponsibilities, related_name="responsibilities"
    
  547.     )
    
  548. 
    
  549.     def __str__(self):
    
  550.         return self.description
    
  551. 
    
  552. 
    
  553. # Models for disjunction join promotion low level testing.
    
  554. 
    
  555. 
    
  556. class FK1(models.Model):
    
  557.     f1 = models.TextField()
    
  558.     f2 = models.TextField()
    
  559. 
    
  560. 
    
  561. class FK2(models.Model):
    
  562.     f1 = models.TextField()
    
  563.     f2 = models.TextField()
    
  564. 
    
  565. 
    
  566. class FK3(models.Model):
    
  567.     f1 = models.TextField()
    
  568.     f2 = models.TextField()
    
  569. 
    
  570. 
    
  571. class BaseA(models.Model):
    
  572.     a = models.ForeignKey(FK1, models.SET_NULL, null=True)
    
  573.     b = models.ForeignKey(FK2, models.SET_NULL, null=True)
    
  574.     c = models.ForeignKey(FK3, models.SET_NULL, null=True)
    
  575. 
    
  576. 
    
  577. class Identifier(models.Model):
    
  578.     name = models.CharField(max_length=100)
    
  579. 
    
  580.     def __str__(self):
    
  581.         return self.name
    
  582. 
    
  583. 
    
  584. class Program(models.Model):
    
  585.     identifier = models.OneToOneField(Identifier, models.CASCADE)
    
  586. 
    
  587. 
    
  588. class Channel(models.Model):
    
  589.     programs = models.ManyToManyField(Program)
    
  590.     identifier = models.OneToOneField(Identifier, models.CASCADE)
    
  591. 
    
  592. 
    
  593. class Book(models.Model):
    
  594.     title = models.TextField()
    
  595.     chapter = models.ForeignKey("Chapter", models.CASCADE)
    
  596. 
    
  597. 
    
  598. class Chapter(models.Model):
    
  599.     title = models.TextField()
    
  600.     paragraph = models.ForeignKey("Paragraph", models.CASCADE)
    
  601. 
    
  602. 
    
  603. class Paragraph(models.Model):
    
  604.     text = models.TextField()
    
  605.     page = models.ManyToManyField("Page")
    
  606. 
    
  607. 
    
  608. class Page(models.Model):
    
  609.     text = models.TextField()
    
  610. 
    
  611. 
    
  612. class MyObject(models.Model):
    
  613.     parent = models.ForeignKey(
    
  614.         "self", models.SET_NULL, null=True, blank=True, related_name="children"
    
  615.     )
    
  616.     data = models.CharField(max_length=100)
    
  617.     created_at = models.DateTimeField(auto_now_add=True)
    
  618. 
    
  619. 
    
  620. # Models for #17600 regressions
    
  621. 
    
  622. 
    
  623. class Order(models.Model):
    
  624.     id = models.IntegerField(primary_key=True)
    
  625.     name = models.CharField(max_length=12, null=True, default="")
    
  626. 
    
  627.     class Meta:
    
  628.         ordering = ("pk",)
    
  629. 
    
  630.     def __str__(self):
    
  631.         return str(self.pk)
    
  632. 
    
  633. 
    
  634. class OrderItem(models.Model):
    
  635.     order = models.ForeignKey(Order, models.CASCADE, related_name="items")
    
  636.     status = models.IntegerField()
    
  637. 
    
  638.     class Meta:
    
  639.         ordering = ("pk",)
    
  640. 
    
  641.     def __str__(self):
    
  642.         return str(self.pk)
    
  643. 
    
  644. 
    
  645. class BaseUser(models.Model):
    
  646.     annotation = models.ForeignKey(Annotation, models.CASCADE, null=True, blank=True)
    
  647. 
    
  648. 
    
  649. class Task(models.Model):
    
  650.     title = models.CharField(max_length=10)
    
  651.     owner = models.ForeignKey(BaseUser, models.CASCADE, related_name="owner")
    
  652.     creator = models.ForeignKey(BaseUser, models.CASCADE, related_name="creator")
    
  653.     note = models.ForeignKey(Note, on_delete=models.CASCADE, null=True, blank=True)
    
  654. 
    
  655.     def __str__(self):
    
  656.         return self.title
    
  657. 
    
  658. 
    
  659. class Staff(models.Model):
    
  660.     name = models.CharField(max_length=10)
    
  661. 
    
  662.     def __str__(self):
    
  663.         return self.name
    
  664. 
    
  665. 
    
  666. class StaffUser(BaseUser):
    
  667.     staff = models.OneToOneField(Staff, models.CASCADE, related_name="user")
    
  668. 
    
  669.     def __str__(self):
    
  670.         return str(self.staff)
    
  671. 
    
  672. 
    
  673. class Ticket21203Parent(models.Model):
    
  674.     parentid = models.AutoField(primary_key=True)
    
  675.     parent_bool = models.BooleanField(default=True)
    
  676.     created = models.DateTimeField(auto_now=True)
    
  677. 
    
  678. 
    
  679. class Ticket21203Child(models.Model):
    
  680.     childid = models.AutoField(primary_key=True)
    
  681.     parent = models.ForeignKey(Ticket21203Parent, models.CASCADE)
    
  682. 
    
  683. 
    
  684. class Person(models.Model):
    
  685.     name = models.CharField(max_length=128)
    
  686. 
    
  687. 
    
  688. class Company(models.Model):
    
  689.     name = models.CharField(max_length=128)
    
  690.     employees = models.ManyToManyField(
    
  691.         Person, related_name="employers", through="Employment"
    
  692.     )
    
  693. 
    
  694.     def __str__(self):
    
  695.         return self.name
    
  696. 
    
  697. 
    
  698. class Employment(models.Model):
    
  699.     employer = models.ForeignKey(Company, models.CASCADE)
    
  700.     employee = models.ForeignKey(Person, models.CASCADE)
    
  701.     title = models.CharField(max_length=128)
    
  702. 
    
  703. 
    
  704. class School(models.Model):
    
  705.     pass
    
  706. 
    
  707. 
    
  708. class Student(models.Model):
    
  709.     school = models.ForeignKey(School, models.CASCADE)
    
  710. 
    
  711. 
    
  712. class Classroom(models.Model):
    
  713.     name = models.CharField(max_length=20)
    
  714.     has_blackboard = models.BooleanField(null=True)
    
  715.     school = models.ForeignKey(School, models.CASCADE)
    
  716.     students = models.ManyToManyField(Student, related_name="classroom")
    
  717. 
    
  718. 
    
  719. class Teacher(models.Model):
    
  720.     schools = models.ManyToManyField(School)
    
  721.     friends = models.ManyToManyField("self")
    
  722. 
    
  723. 
    
  724. class Ticket23605AParent(models.Model):
    
  725.     pass
    
  726. 
    
  727. 
    
  728. class Ticket23605A(Ticket23605AParent):
    
  729.     pass
    
  730. 
    
  731. 
    
  732. class Ticket23605B(models.Model):
    
  733.     modela_fk = models.ForeignKey(Ticket23605A, models.CASCADE)
    
  734.     modelc_fk = models.ForeignKey("Ticket23605C", models.CASCADE)
    
  735.     field_b0 = models.IntegerField(null=True)
    
  736.     field_b1 = models.BooleanField(default=False)
    
  737. 
    
  738. 
    
  739. class Ticket23605C(models.Model):
    
  740.     field_c0 = models.FloatField()
    
  741. 
    
  742. 
    
  743. # db_table names have capital letters to ensure they are quoted in queries.
    
  744. class Individual(models.Model):
    
  745.     alive = models.BooleanField()
    
  746. 
    
  747.     class Meta:
    
  748.         db_table = "Individual"
    
  749. 
    
  750. 
    
  751. class RelatedIndividual(models.Model):
    
  752.     related = models.ForeignKey(
    
  753.         Individual, models.CASCADE, related_name="related_individual"
    
  754.     )
    
  755. 
    
  756.     class Meta:
    
  757.         db_table = "RelatedIndividual"
    
  758. 
    
  759. 
    
  760. class CustomDbColumn(models.Model):
    
  761.     custom_column = models.IntegerField(db_column="custom_name", null=True)
    
  762.     ip_address = models.GenericIPAddressField(null=True)
    
  763. 
    
  764. 
    
  765. class CreatedField(models.DateTimeField):
    
  766.     db_returning = True
    
  767. 
    
  768.     def __init__(self, *args, **kwargs):
    
  769.         kwargs.setdefault("default", Now)
    
  770.         super().__init__(*args, **kwargs)
    
  771. 
    
  772. 
    
  773. class ReturningModel(models.Model):
    
  774.     created = CreatedField(editable=False)
    
  775. 
    
  776. 
    
  777. class NonIntegerPKReturningModel(models.Model):
    
  778.     created = CreatedField(editable=False, primary_key=True)
    
  779. 
    
  780. 
    
  781. class JSONFieldNullable(models.Model):
    
  782.     json_field = models.JSONField(blank=True, null=True)
    
  783. 
    
  784.     class Meta:
    
  785.         required_db_features = {"supports_json_field"}