models.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751
  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. class DumbCategory(models.Model):
  7. pass
  8. class ProxyCategory(DumbCategory):
  9. class Meta:
  10. proxy = True
  11. class NamedCategory(DumbCategory):
  12. name = models.CharField(max_length=10)
  13. def __str__(self):
  14. return self.name
  15. class Tag(models.Model):
  16. name = models.CharField(max_length=10)
  17. parent = models.ForeignKey(
  18. 'self',
  19. models.SET_NULL,
  20. blank=True, null=True,
  21. related_name='children',
  22. )
  23. category = models.ForeignKey(NamedCategory, models.SET_NULL, null=True, default=None)
  24. class Meta:
  25. ordering = ['name']
  26. def __str__(self):
  27. return self.name
  28. class Note(models.Model):
  29. note = models.CharField(max_length=100)
  30. misc = models.CharField(max_length=25)
  31. tag = models.ForeignKey(Tag, models.SET_NULL, blank=True, null=True)
  32. negate = models.BooleanField(default=True)
  33. class Meta:
  34. ordering = ['note']
  35. def __str__(self):
  36. return self.note
  37. class Annotation(models.Model):
  38. name = models.CharField(max_length=10)
  39. tag = models.ForeignKey(Tag, models.CASCADE)
  40. notes = models.ManyToManyField(Note)
  41. def __str__(self):
  42. return self.name
  43. class DateTimePK(models.Model):
  44. date = models.DateTimeField(primary_key=True, auto_now_add=True)
  45. class ExtraInfo(models.Model):
  46. info = models.CharField(max_length=100)
  47. note = models.ForeignKey(Note, models.CASCADE, null=True)
  48. value = models.IntegerField(null=True)
  49. date = models.ForeignKey(DateTimePK, models.SET_NULL, null=True)
  50. filterable = models.BooleanField(default=True)
  51. class Meta:
  52. ordering = ['info']
  53. def __str__(self):
  54. return self.info
  55. class Author(models.Model):
  56. name = models.CharField(max_length=10)
  57. num = models.IntegerField(unique=True)
  58. extra = models.ForeignKey(ExtraInfo, models.CASCADE)
  59. class Meta:
  60. ordering = ['name']
  61. def __str__(self):
  62. return self.name
  63. class Item(models.Model):
  64. name = models.CharField(max_length=10)
  65. created = models.DateTimeField()
  66. modified = models.DateTimeField(blank=True, null=True)
  67. tags = models.ManyToManyField(Tag, blank=True)
  68. creator = models.ForeignKey(Author, models.CASCADE)
  69. note = models.ForeignKey(Note, models.CASCADE)
  70. class Meta:
  71. ordering = ['-note', 'name']
  72. def __str__(self):
  73. return self.name
  74. class Report(models.Model):
  75. name = models.CharField(max_length=10)
  76. creator = models.ForeignKey(Author, models.SET_NULL, to_field='num', null=True)
  77. def __str__(self):
  78. return self.name
  79. class ReportComment(models.Model):
  80. report = models.ForeignKey(Report, models.CASCADE)
  81. class Ranking(models.Model):
  82. rank = models.IntegerField()
  83. author = models.ForeignKey(Author, models.CASCADE)
  84. class Meta:
  85. # A complex ordering specification. Should stress the system a bit.
  86. ordering = ('author__extra__note', 'author__name', 'rank')
  87. def __str__(self):
  88. return '%d: %s' % (self.rank, self.author.name)
  89. class Cover(models.Model):
  90. title = models.CharField(max_length=50)
  91. item = models.ForeignKey(Item, models.CASCADE)
  92. class Meta:
  93. ordering = ['item']
  94. def __str__(self):
  95. return self.title
  96. class Number(models.Model):
  97. num = models.IntegerField()
  98. other_num = models.IntegerField(null=True)
  99. another_num = models.IntegerField(null=True)
  100. def __str__(self):
  101. return str(self.num)
  102. # Symmetrical m2m field with a normal field using the reverse accessor name
  103. # ("valid").
  104. class Valid(models.Model):
  105. valid = models.CharField(max_length=10)
  106. parent = models.ManyToManyField('self')
  107. class Meta:
  108. ordering = ['valid']
  109. # Some funky cross-linked models for testing a couple of infinite recursion
  110. # cases.
  111. class X(models.Model):
  112. y = models.ForeignKey('Y', models.CASCADE)
  113. class Y(models.Model):
  114. x1 = models.ForeignKey(X, models.CASCADE, related_name='y1')
  115. # Some models with a cycle in the default ordering. This would be bad if we
  116. # didn't catch the infinite loop.
  117. class LoopX(models.Model):
  118. y = models.ForeignKey('LoopY', models.CASCADE)
  119. class Meta:
  120. ordering = ['y']
  121. class LoopY(models.Model):
  122. x = models.ForeignKey(LoopX, models.CASCADE)
  123. class Meta:
  124. ordering = ['x']
  125. class LoopZ(models.Model):
  126. z = models.ForeignKey('self', models.CASCADE)
  127. class Meta:
  128. ordering = ['z']
  129. # A model and custom default manager combination.
  130. class CustomManager(models.Manager):
  131. def get_queryset(self):
  132. qs = super().get_queryset()
  133. return qs.filter(public=True, tag__name='t1')
  134. class ManagedModel(models.Model):
  135. data = models.CharField(max_length=10)
  136. tag = models.ForeignKey(Tag, models.CASCADE)
  137. public = models.BooleanField(default=True)
  138. objects = CustomManager()
  139. normal_manager = models.Manager()
  140. def __str__(self):
  141. return self.data
  142. # An inter-related setup with multiple paths from Child to Detail.
  143. class Detail(models.Model):
  144. data = models.CharField(max_length=10)
  145. class MemberManager(models.Manager):
  146. def get_queryset(self):
  147. return super().get_queryset().select_related("details")
  148. class Member(models.Model):
  149. name = models.CharField(max_length=10)
  150. details = models.OneToOneField(Detail, models.CASCADE, primary_key=True)
  151. objects = MemberManager()
  152. class Child(models.Model):
  153. person = models.OneToOneField(Member, models.CASCADE, primary_key=True)
  154. parent = models.ForeignKey(Member, models.CASCADE, related_name="children")
  155. # Custom primary keys interfered with ordering in the past.
  156. class CustomPk(models.Model):
  157. name = models.CharField(max_length=10, primary_key=True)
  158. extra = models.CharField(max_length=10)
  159. class Meta:
  160. ordering = ['name', 'extra']
  161. class Related(models.Model):
  162. custom = models.ForeignKey(CustomPk, models.CASCADE, null=True)
  163. class CustomPkTag(models.Model):
  164. id = models.CharField(max_length=20, primary_key=True)
  165. custom_pk = models.ManyToManyField(CustomPk)
  166. tag = models.CharField(max_length=20)
  167. # An inter-related setup with a model subclass that has a nullable
  168. # path to another model, and a return path from that model.
  169. class Celebrity(models.Model):
  170. name = models.CharField("Name", max_length=20)
  171. greatest_fan = models.ForeignKey("Fan", models.SET_NULL, null=True, unique=True)
  172. def __str__(self):
  173. return self.name
  174. class TvChef(Celebrity):
  175. pass
  176. class Fan(models.Model):
  177. fan_of = models.ForeignKey(Celebrity, models.CASCADE)
  178. # Multiple foreign keys
  179. class LeafA(models.Model):
  180. data = models.CharField(max_length=10)
  181. def __str__(self):
  182. return self.data
  183. class LeafB(models.Model):
  184. data = models.CharField(max_length=10)
  185. class Join(models.Model):
  186. a = models.ForeignKey(LeafA, models.CASCADE)
  187. b = models.ForeignKey(LeafB, models.CASCADE)
  188. class ReservedName(models.Model):
  189. name = models.CharField(max_length=20)
  190. order = models.IntegerField()
  191. def __str__(self):
  192. return self.name
  193. # A simpler shared-foreign-key setup that can expose some problems.
  194. class SharedConnection(models.Model):
  195. data = models.CharField(max_length=10)
  196. def __str__(self):
  197. return self.data
  198. class PointerA(models.Model):
  199. connection = models.ForeignKey(SharedConnection, models.CASCADE)
  200. class PointerB(models.Model):
  201. connection = models.ForeignKey(SharedConnection, models.CASCADE)
  202. # Multi-layer ordering
  203. class SingleObject(models.Model):
  204. name = models.CharField(max_length=10)
  205. class Meta:
  206. ordering = ['name']
  207. def __str__(self):
  208. return self.name
  209. class RelatedObject(models.Model):
  210. single = models.ForeignKey(SingleObject, models.SET_NULL, null=True)
  211. f = models.IntegerField(null=True)
  212. class Meta:
  213. ordering = ['single']
  214. class Plaything(models.Model):
  215. name = models.CharField(max_length=10)
  216. others = models.ForeignKey(RelatedObject, models.SET_NULL, null=True)
  217. class Meta:
  218. ordering = ['others']
  219. def __str__(self):
  220. return self.name
  221. class Article(models.Model):
  222. name = models.CharField(max_length=20)
  223. created = models.DateTimeField()
  224. def __str__(self):
  225. return self.name
  226. class Food(models.Model):
  227. name = models.CharField(max_length=20, unique=True)
  228. def __str__(self):
  229. return self.name
  230. class Eaten(models.Model):
  231. food = models.ForeignKey(Food, models.SET_NULL, to_field="name", null=True)
  232. meal = models.CharField(max_length=20)
  233. def __str__(self):
  234. return "%s at %s" % (self.food, self.meal)
  235. class Node(models.Model):
  236. num = models.IntegerField(unique=True)
  237. parent = models.ForeignKey("self", models.SET_NULL, to_field="num", null=True)
  238. def __str__(self):
  239. return str(self.num)
  240. # Bug #12252
  241. class ObjectA(models.Model):
  242. name = models.CharField(max_length=50)
  243. def __str__(self):
  244. return self.name
  245. def __iter__(self):
  246. # Ticket #23721
  247. assert False, 'type checking should happen without calling model __iter__'
  248. class ProxyObjectA(ObjectA):
  249. class Meta:
  250. proxy = True
  251. class ChildObjectA(ObjectA):
  252. pass
  253. class ObjectB(models.Model):
  254. name = models.CharField(max_length=50)
  255. objecta = models.ForeignKey(ObjectA, models.CASCADE)
  256. num = models.PositiveIntegerField()
  257. def __str__(self):
  258. return self.name
  259. class ProxyObjectB(ObjectB):
  260. class Meta:
  261. proxy = True
  262. class ObjectC(models.Model):
  263. name = models.CharField(max_length=50)
  264. objecta = models.ForeignKey(ObjectA, models.SET_NULL, null=True)
  265. objectb = models.ForeignKey(ObjectB, models.SET_NULL, null=True)
  266. childobjecta = models.ForeignKey(ChildObjectA, models.SET_NULL, null=True, related_name='ca_pk')
  267. def __str__(self):
  268. return self.name
  269. class SimpleCategory(models.Model):
  270. name = models.CharField(max_length=25)
  271. def __str__(self):
  272. return self.name
  273. class SpecialCategory(SimpleCategory):
  274. special_name = models.CharField(max_length=35)
  275. def __str__(self):
  276. return self.name + " " + self.special_name
  277. class CategoryItem(models.Model):
  278. category = models.ForeignKey(SimpleCategory, models.CASCADE)
  279. def __str__(self):
  280. return "category item: " + str(self.category)
  281. class MixedCaseFieldCategoryItem(models.Model):
  282. CaTeGoRy = models.ForeignKey(SimpleCategory, models.CASCADE)
  283. class MixedCaseDbColumnCategoryItem(models.Model):
  284. category = models.ForeignKey(SimpleCategory, models.CASCADE, db_column='CaTeGoRy_Id')
  285. class OneToOneCategory(models.Model):
  286. new_name = models.CharField(max_length=15)
  287. category = models.OneToOneField(SimpleCategory, models.CASCADE)
  288. def __str__(self):
  289. return "one2one " + self.new_name
  290. class CategoryRelationship(models.Model):
  291. first = models.ForeignKey(SimpleCategory, models.CASCADE, related_name='first_rel')
  292. second = models.ForeignKey(SimpleCategory, models.CASCADE, related_name='second_rel')
  293. class CommonMixedCaseForeignKeys(models.Model):
  294. category = models.ForeignKey(CategoryItem, models.CASCADE)
  295. mixed_case_field_category = models.ForeignKey(MixedCaseFieldCategoryItem, models.CASCADE)
  296. mixed_case_db_column_category = models.ForeignKey(MixedCaseDbColumnCategoryItem, models.CASCADE)
  297. class NullableName(models.Model):
  298. name = models.CharField(max_length=20, null=True)
  299. class Meta:
  300. ordering = ['id']
  301. class ModelD(models.Model):
  302. name = models.TextField()
  303. class ModelC(models.Model):
  304. name = models.TextField()
  305. class ModelB(models.Model):
  306. name = models.TextField()
  307. c = models.ForeignKey(ModelC, models.CASCADE)
  308. class ModelA(models.Model):
  309. name = models.TextField()
  310. b = models.ForeignKey(ModelB, models.SET_NULL, null=True)
  311. d = models.ForeignKey(ModelD, models.CASCADE)
  312. class Job(models.Model):
  313. name = models.CharField(max_length=20, unique=True)
  314. def __str__(self):
  315. return self.name
  316. class JobResponsibilities(models.Model):
  317. job = models.ForeignKey(Job, models.CASCADE, to_field='name')
  318. responsibility = models.ForeignKey('Responsibility', models.CASCADE, to_field='description')
  319. class Responsibility(models.Model):
  320. description = models.CharField(max_length=20, unique=True)
  321. jobs = models.ManyToManyField(Job, through=JobResponsibilities,
  322. related_name='responsibilities')
  323. def __str__(self):
  324. return self.description
  325. # Models for disjunction join promotion low level testing.
  326. class FK1(models.Model):
  327. f1 = models.TextField()
  328. f2 = models.TextField()
  329. class FK2(models.Model):
  330. f1 = models.TextField()
  331. f2 = models.TextField()
  332. class FK3(models.Model):
  333. f1 = models.TextField()
  334. f2 = models.TextField()
  335. class BaseA(models.Model):
  336. a = models.ForeignKey(FK1, models.SET_NULL, null=True)
  337. b = models.ForeignKey(FK2, models.SET_NULL, null=True)
  338. c = models.ForeignKey(FK3, models.SET_NULL, null=True)
  339. class Identifier(models.Model):
  340. name = models.CharField(max_length=100)
  341. def __str__(self):
  342. return self.name
  343. class Program(models.Model):
  344. identifier = models.OneToOneField(Identifier, models.CASCADE)
  345. class Channel(models.Model):
  346. programs = models.ManyToManyField(Program)
  347. identifier = models.OneToOneField(Identifier, models.CASCADE)
  348. class Book(models.Model):
  349. title = models.TextField()
  350. chapter = models.ForeignKey('Chapter', models.CASCADE)
  351. class Chapter(models.Model):
  352. title = models.TextField()
  353. paragraph = models.ForeignKey('Paragraph', models.CASCADE)
  354. class Paragraph(models.Model):
  355. text = models.TextField()
  356. page = models.ManyToManyField('Page')
  357. class Page(models.Model):
  358. text = models.TextField()
  359. class MyObject(models.Model):
  360. parent = models.ForeignKey('self', models.SET_NULL, null=True, blank=True, related_name='children')
  361. data = models.CharField(max_length=100)
  362. created_at = models.DateTimeField(auto_now_add=True)
  363. # Models for #17600 regressions
  364. class Order(models.Model):
  365. id = models.IntegerField(primary_key=True)
  366. name = models.CharField(max_length=12, null=True, default='')
  367. class Meta:
  368. ordering = ('pk',)
  369. def __str__(self):
  370. return str(self.pk)
  371. class OrderItem(models.Model):
  372. order = models.ForeignKey(Order, models.CASCADE, related_name='items')
  373. status = models.IntegerField()
  374. class Meta:
  375. ordering = ('pk',)
  376. def __str__(self):
  377. return str(self.pk)
  378. class BaseUser(models.Model):
  379. annotation = models.ForeignKey(Annotation, models.CASCADE, null=True, blank=True)
  380. class Task(models.Model):
  381. title = models.CharField(max_length=10)
  382. owner = models.ForeignKey(BaseUser, models.CASCADE, related_name='owner')
  383. creator = models.ForeignKey(BaseUser, models.CASCADE, related_name='creator')
  384. note = models.ForeignKey(Note, on_delete=models.CASCADE, null=True, blank=True)
  385. def __str__(self):
  386. return self.title
  387. class Staff(models.Model):
  388. name = models.CharField(max_length=10)
  389. def __str__(self):
  390. return self.name
  391. class StaffUser(BaseUser):
  392. staff = models.OneToOneField(Staff, models.CASCADE, related_name='user')
  393. def __str__(self):
  394. return str(self.staff)
  395. class Ticket21203Parent(models.Model):
  396. parentid = models.AutoField(primary_key=True)
  397. parent_bool = models.BooleanField(default=True)
  398. created = models.DateTimeField(auto_now=True)
  399. class Ticket21203Child(models.Model):
  400. childid = models.AutoField(primary_key=True)
  401. parent = models.ForeignKey(Ticket21203Parent, models.CASCADE)
  402. class Person(models.Model):
  403. name = models.CharField(max_length=128)
  404. class Company(models.Model):
  405. name = models.CharField(max_length=128)
  406. employees = models.ManyToManyField(Person, related_name='employers', through='Employment')
  407. def __str__(self):
  408. return self.name
  409. class Employment(models.Model):
  410. employer = models.ForeignKey(Company, models.CASCADE)
  411. employee = models.ForeignKey(Person, models.CASCADE)
  412. title = models.CharField(max_length=128)
  413. class School(models.Model):
  414. pass
  415. class Student(models.Model):
  416. school = models.ForeignKey(School, models.CASCADE)
  417. class Classroom(models.Model):
  418. name = models.CharField(max_length=20)
  419. has_blackboard = models.BooleanField(null=True)
  420. school = models.ForeignKey(School, models.CASCADE)
  421. students = models.ManyToManyField(Student, related_name='classroom')
  422. class Teacher(models.Model):
  423. schools = models.ManyToManyField(School)
  424. friends = models.ManyToManyField('self')
  425. class Ticket23605AParent(models.Model):
  426. pass
  427. class Ticket23605A(Ticket23605AParent):
  428. pass
  429. class Ticket23605B(models.Model):
  430. modela_fk = models.ForeignKey(Ticket23605A, models.CASCADE)
  431. modelc_fk = models.ForeignKey("Ticket23605C", models.CASCADE)
  432. field_b0 = models.IntegerField(null=True)
  433. field_b1 = models.BooleanField(default=False)
  434. class Ticket23605C(models.Model):
  435. field_c0 = models.FloatField()
  436. # db_table names have capital letters to ensure they are quoted in queries.
  437. class Individual(models.Model):
  438. alive = models.BooleanField()
  439. class Meta:
  440. db_table = 'Individual'
  441. class RelatedIndividual(models.Model):
  442. related = models.ForeignKey(Individual, models.CASCADE, related_name='related_individual')
  443. class Meta:
  444. db_table = 'RelatedIndividual'
  445. class CustomDbColumn(models.Model):
  446. custom_column = models.IntegerField(db_column='custom_name', null=True)
  447. ip_address = models.GenericIPAddressField(null=True)
  448. class CreatedField(models.DateTimeField):
  449. db_returning = True
  450. def __init__(self, *args, **kwargs):
  451. kwargs.setdefault('default', Now)
  452. super().__init__(*args, **kwargs)
  453. class ReturningModel(models.Model):
  454. created = CreatedField(editable=False)
  455. class NonIntegerPKReturningModel(models.Model):
  456. created = CreatedField(editable=False, primary_key=True)
  457. class JSONFieldNullable(models.Model):
  458. json_field = models.JSONField(blank=True, null=True)
  459. class Meta:
  460. required_db_features = {'supports_json_field'}