models.py 18 KB

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