models.py 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048
  1. import datetime
  2. import tempfile
  3. import uuid
  4. from django.contrib import admin
  5. from django.contrib.auth.models import User
  6. from django.contrib.contenttypes.fields import (
  7. GenericForeignKey, GenericRelation,
  8. )
  9. from django.contrib.contenttypes.models import ContentType
  10. from django.core.exceptions import ValidationError
  11. from django.core.files.storage import FileSystemStorage
  12. from django.db import models
  13. class Section(models.Model):
  14. """
  15. A simple section that links to articles, to test linking to related items
  16. in admin views.
  17. """
  18. name = models.CharField(max_length=100)
  19. def __str__(self):
  20. return self.name
  21. @property
  22. def name_property(self):
  23. """
  24. A property that simply returns the name. Used to test #24461
  25. """
  26. return self.name
  27. class Article(models.Model):
  28. """
  29. A simple article to test admin views. Test backwards compatibility.
  30. """
  31. title = models.CharField(max_length=100)
  32. content = models.TextField()
  33. date = models.DateTimeField()
  34. section = models.ForeignKey(Section, models.CASCADE, null=True, blank=True)
  35. another_section = models.ForeignKey(Section, models.CASCADE, null=True, blank=True, related_name='+')
  36. sub_section = models.ForeignKey(Section, models.SET_NULL, null=True, blank=True, related_name='+')
  37. def __str__(self):
  38. return self.title
  39. @admin.display(ordering='date', description='')
  40. def model_year(self):
  41. return self.date.year
  42. @admin.display(ordering='-date', description='')
  43. def model_year_reversed(self):
  44. return self.date.year
  45. @property
  46. @admin.display(ordering='date')
  47. def model_property_year(self):
  48. return self.date.year
  49. @property
  50. def model_month(self):
  51. return self.date.month
  52. class Book(models.Model):
  53. """
  54. A simple book that has chapters.
  55. """
  56. name = models.CharField(max_length=100, verbose_name='¿Name?')
  57. def __str__(self):
  58. return self.name
  59. class Promo(models.Model):
  60. name = models.CharField(max_length=100, verbose_name='¿Name?')
  61. book = models.ForeignKey(Book, models.CASCADE)
  62. author = models.ForeignKey(User, models.SET_NULL, blank=True, null=True)
  63. def __str__(self):
  64. return self.name
  65. class Chapter(models.Model):
  66. title = models.CharField(max_length=100, verbose_name='¿Title?')
  67. content = models.TextField()
  68. book = models.ForeignKey(Book, models.CASCADE)
  69. class Meta:
  70. # Use a utf-8 bytestring to ensure it works (see #11710)
  71. verbose_name = '¿Chapter?'
  72. def __str__(self):
  73. return self.title
  74. class ChapterXtra1(models.Model):
  75. chap = models.OneToOneField(Chapter, models.CASCADE, verbose_name='¿Chap?')
  76. xtra = models.CharField(max_length=100, verbose_name='¿Xtra?')
  77. guest_author = models.ForeignKey(User, models.SET_NULL, blank=True, null=True)
  78. def __str__(self):
  79. return '¿Xtra1: %s' % self.xtra
  80. class ChapterXtra2(models.Model):
  81. chap = models.OneToOneField(Chapter, models.CASCADE, verbose_name='¿Chap?')
  82. xtra = models.CharField(max_length=100, verbose_name='¿Xtra?')
  83. def __str__(self):
  84. return '¿Xtra2: %s' % self.xtra
  85. class RowLevelChangePermissionModel(models.Model):
  86. name = models.CharField(max_length=100, blank=True)
  87. class CustomArticle(models.Model):
  88. content = models.TextField()
  89. date = models.DateTimeField()
  90. class ModelWithStringPrimaryKey(models.Model):
  91. string_pk = models.CharField(max_length=255, primary_key=True)
  92. def __str__(self):
  93. return self.string_pk
  94. def get_absolute_url(self):
  95. return '/dummy/%s/' % self.string_pk
  96. class Color(models.Model):
  97. value = models.CharField(max_length=10)
  98. warm = models.BooleanField(default=False)
  99. def __str__(self):
  100. return self.value
  101. # we replicate Color to register with another ModelAdmin
  102. class Color2(Color):
  103. class Meta:
  104. proxy = True
  105. class Thing(models.Model):
  106. title = models.CharField(max_length=20)
  107. color = models.ForeignKey(Color, models.CASCADE, limit_choices_to={'warm': True})
  108. pub_date = models.DateField(blank=True, null=True)
  109. def __str__(self):
  110. return self.title
  111. class Actor(models.Model):
  112. name = models.CharField(max_length=50)
  113. age = models.IntegerField()
  114. title = models.CharField(max_length=50, null=True, blank=True)
  115. def __str__(self):
  116. return self.name
  117. class Inquisition(models.Model):
  118. expected = models.BooleanField(default=False)
  119. leader = models.ForeignKey(Actor, models.CASCADE)
  120. country = models.CharField(max_length=20)
  121. def __str__(self):
  122. return "by %s from %s" % (self.leader, self.country)
  123. class Sketch(models.Model):
  124. title = models.CharField(max_length=100)
  125. inquisition = models.ForeignKey(
  126. Inquisition,
  127. models.CASCADE,
  128. limit_choices_to={
  129. 'leader__name': 'Palin',
  130. 'leader__age': 27,
  131. 'expected': False,
  132. },
  133. )
  134. defendant0 = models.ForeignKey(
  135. Actor,
  136. models.CASCADE,
  137. limit_choices_to={'title__isnull': False},
  138. related_name='as_defendant0',
  139. )
  140. defendant1 = models.ForeignKey(
  141. Actor,
  142. models.CASCADE,
  143. limit_choices_to={'title__isnull': True},
  144. related_name='as_defendant1',
  145. )
  146. def __str__(self):
  147. return self.title
  148. def today_callable_dict():
  149. return {"last_action__gte": datetime.datetime.today()}
  150. def today_callable_q():
  151. return models.Q(last_action__gte=datetime.datetime.today())
  152. class Character(models.Model):
  153. username = models.CharField(max_length=100)
  154. last_action = models.DateTimeField()
  155. def __str__(self):
  156. return self.username
  157. class StumpJoke(models.Model):
  158. variation = models.CharField(max_length=100)
  159. most_recently_fooled = models.ForeignKey(
  160. Character,
  161. models.CASCADE,
  162. limit_choices_to=today_callable_dict,
  163. related_name="+",
  164. )
  165. has_fooled_today = models.ManyToManyField(Character, limit_choices_to=today_callable_q, related_name="+")
  166. def __str__(self):
  167. return self.variation
  168. class Fabric(models.Model):
  169. NG_CHOICES = (
  170. ('Textured', (
  171. ('x', 'Horizontal'),
  172. ('y', 'Vertical'),
  173. )),
  174. ('plain', 'Smooth'),
  175. )
  176. surface = models.CharField(max_length=20, choices=NG_CHOICES)
  177. class Person(models.Model):
  178. GENDER_CHOICES = (
  179. (1, "Male"),
  180. (2, "Female"),
  181. )
  182. name = models.CharField(max_length=100)
  183. gender = models.IntegerField(choices=GENDER_CHOICES)
  184. age = models.IntegerField(default=21)
  185. alive = models.BooleanField(default=True)
  186. def __str__(self):
  187. return self.name
  188. class Persona(models.Model):
  189. """
  190. A simple persona associated with accounts, to test inlining of related
  191. accounts which inherit from a common accounts class.
  192. """
  193. name = models.CharField(blank=False, max_length=80)
  194. def __str__(self):
  195. return self.name
  196. class Account(models.Model):
  197. """
  198. A simple, generic account encapsulating the information shared by all
  199. types of accounts.
  200. """
  201. username = models.CharField(blank=False, max_length=80)
  202. persona = models.ForeignKey(Persona, models.CASCADE, related_name="accounts")
  203. servicename = 'generic service'
  204. def __str__(self):
  205. return "%s: %s" % (self.servicename, self.username)
  206. class FooAccount(Account):
  207. """A service-specific account of type Foo."""
  208. servicename = 'foo'
  209. class BarAccount(Account):
  210. """A service-specific account of type Bar."""
  211. servicename = 'bar'
  212. class Subscriber(models.Model):
  213. name = models.CharField(blank=False, max_length=80)
  214. email = models.EmailField(blank=False, max_length=175)
  215. def __str__(self):
  216. return "%s (%s)" % (self.name, self.email)
  217. class ExternalSubscriber(Subscriber):
  218. pass
  219. class OldSubscriber(Subscriber):
  220. pass
  221. class Media(models.Model):
  222. name = models.CharField(max_length=60)
  223. class Podcast(Media):
  224. release_date = models.DateField()
  225. class Meta:
  226. ordering = ('release_date',) # overridden in PodcastAdmin
  227. class Vodcast(Media):
  228. media = models.OneToOneField(Media, models.CASCADE, primary_key=True, parent_link=True)
  229. released = models.BooleanField(default=False)
  230. class Parent(models.Model):
  231. name = models.CharField(max_length=128)
  232. def clean(self):
  233. if self.name == '_invalid':
  234. raise ValidationError('invalid')
  235. class Child(models.Model):
  236. parent = models.ForeignKey(Parent, models.CASCADE, editable=False)
  237. name = models.CharField(max_length=30, blank=True)
  238. def clean(self):
  239. if self.name == '_invalid':
  240. raise ValidationError('invalid')
  241. class PKChild(models.Model):
  242. """
  243. Used to check autocomplete to_field resolution when ForeignKey is PK.
  244. """
  245. parent = models.ForeignKey(Parent, models.CASCADE, primary_key=True)
  246. name = models.CharField(max_length=128)
  247. class Meta:
  248. ordering = ['parent']
  249. def __str__(self):
  250. return self.name
  251. class Toy(models.Model):
  252. child = models.ForeignKey(PKChild, models.CASCADE)
  253. class EmptyModel(models.Model):
  254. def __str__(self):
  255. return "Primary key = %s" % self.id
  256. temp_storage = FileSystemStorage(tempfile.mkdtemp())
  257. class Gallery(models.Model):
  258. name = models.CharField(max_length=100)
  259. class Picture(models.Model):
  260. name = models.CharField(max_length=100)
  261. image = models.FileField(storage=temp_storage, upload_to='test_upload')
  262. gallery = models.ForeignKey(Gallery, models.CASCADE, related_name="pictures")
  263. class Language(models.Model):
  264. iso = models.CharField(max_length=5, primary_key=True)
  265. name = models.CharField(max_length=50)
  266. english_name = models.CharField(max_length=50)
  267. shortlist = models.BooleanField(default=False)
  268. def __str__(self):
  269. return self.iso
  270. class Meta:
  271. ordering = ('iso',)
  272. # a base class for Recommender and Recommendation
  273. class Title(models.Model):
  274. pass
  275. class TitleTranslation(models.Model):
  276. title = models.ForeignKey(Title, models.CASCADE)
  277. text = models.CharField(max_length=100)
  278. class Recommender(Title):
  279. pass
  280. class Recommendation(Title):
  281. the_recommender = models.ForeignKey(Recommender, models.CASCADE)
  282. class Collector(models.Model):
  283. name = models.CharField(max_length=100)
  284. class Widget(models.Model):
  285. owner = models.ForeignKey(Collector, models.CASCADE)
  286. name = models.CharField(max_length=100)
  287. class DooHickey(models.Model):
  288. code = models.CharField(max_length=10, primary_key=True)
  289. owner = models.ForeignKey(Collector, models.CASCADE)
  290. name = models.CharField(max_length=100)
  291. class Grommet(models.Model):
  292. code = models.AutoField(primary_key=True)
  293. owner = models.ForeignKey(Collector, models.CASCADE)
  294. name = models.CharField(max_length=100)
  295. class Whatsit(models.Model):
  296. index = models.IntegerField(primary_key=True)
  297. owner = models.ForeignKey(Collector, models.CASCADE)
  298. name = models.CharField(max_length=100)
  299. class Doodad(models.Model):
  300. name = models.CharField(max_length=100)
  301. class FancyDoodad(Doodad):
  302. owner = models.ForeignKey(Collector, models.CASCADE)
  303. expensive = models.BooleanField(default=True)
  304. class Category(models.Model):
  305. collector = models.ForeignKey(Collector, models.CASCADE)
  306. order = models.PositiveIntegerField()
  307. class Meta:
  308. ordering = ('order',)
  309. def __str__(self):
  310. return '%s:o%s' % (self.id, self.order)
  311. def link_posted_default():
  312. return datetime.date.today() - datetime.timedelta(days=7)
  313. class Link(models.Model):
  314. posted = models.DateField(default=link_posted_default)
  315. url = models.URLField()
  316. post = models.ForeignKey("Post", models.CASCADE)
  317. readonly_link_content = models.TextField()
  318. class PrePopulatedPost(models.Model):
  319. title = models.CharField(max_length=100)
  320. published = models.BooleanField(default=False)
  321. slug = models.SlugField()
  322. class PrePopulatedSubPost(models.Model):
  323. post = models.ForeignKey(PrePopulatedPost, models.CASCADE)
  324. subtitle = models.CharField(max_length=100)
  325. subslug = models.SlugField()
  326. class Post(models.Model):
  327. title = models.CharField(max_length=100, help_text='Some help text for the title (with Unicode ŠĐĆŽćžšđ)')
  328. content = models.TextField(help_text='Some help text for the content (with Unicode ŠĐĆŽćžšđ)')
  329. readonly_content = models.TextField()
  330. posted = models.DateField(
  331. default=datetime.date.today,
  332. help_text='Some help text for the date (with Unicode ŠĐĆŽćžšđ)',
  333. )
  334. public = models.BooleanField(null=True, blank=True)
  335. def awesomeness_level(self):
  336. return "Very awesome."
  337. # Proxy model to test overridden fields attrs on Post model so as not to
  338. # interfere with other tests.
  339. class FieldOverridePost(Post):
  340. class Meta:
  341. proxy = True
  342. class Gadget(models.Model):
  343. name = models.CharField(max_length=100)
  344. def __str__(self):
  345. return self.name
  346. class Villain(models.Model):
  347. name = models.CharField(max_length=100)
  348. def __str__(self):
  349. return self.name
  350. class SuperVillain(Villain):
  351. pass
  352. class FunkyTag(models.Model):
  353. "Because we all know there's only one real use case for GFKs."
  354. name = models.CharField(max_length=25)
  355. content_type = models.ForeignKey(ContentType, models.CASCADE)
  356. object_id = models.PositiveIntegerField()
  357. content_object = GenericForeignKey('content_type', 'object_id')
  358. def __str__(self):
  359. return self.name
  360. class Plot(models.Model):
  361. name = models.CharField(max_length=100)
  362. team_leader = models.ForeignKey(Villain, models.CASCADE, related_name='lead_plots')
  363. contact = models.ForeignKey(Villain, models.CASCADE, related_name='contact_plots')
  364. tags = GenericRelation(FunkyTag)
  365. def __str__(self):
  366. return self.name
  367. class PlotDetails(models.Model):
  368. details = models.CharField(max_length=100)
  369. plot = models.OneToOneField(Plot, models.CASCADE, null=True, blank=True)
  370. def __str__(self):
  371. return self.details
  372. class PlotProxy(Plot):
  373. class Meta:
  374. proxy = True
  375. class SecretHideout(models.Model):
  376. """ Secret! Not registered with the admin! """
  377. location = models.CharField(max_length=100)
  378. villain = models.ForeignKey(Villain, models.CASCADE)
  379. def __str__(self):
  380. return self.location
  381. class SuperSecretHideout(models.Model):
  382. """ Secret! Not registered with the admin! """
  383. location = models.CharField(max_length=100)
  384. supervillain = models.ForeignKey(SuperVillain, models.CASCADE)
  385. def __str__(self):
  386. return self.location
  387. class Bookmark(models.Model):
  388. name = models.CharField(max_length=60)
  389. tag = GenericRelation(FunkyTag, related_query_name='bookmark')
  390. def __str__(self):
  391. return self.name
  392. class CyclicOne(models.Model):
  393. name = models.CharField(max_length=25)
  394. two = models.ForeignKey('CyclicTwo', models.CASCADE)
  395. def __str__(self):
  396. return self.name
  397. class CyclicTwo(models.Model):
  398. name = models.CharField(max_length=25)
  399. one = models.ForeignKey(CyclicOne, models.CASCADE)
  400. def __str__(self):
  401. return self.name
  402. class Topping(models.Model):
  403. name = models.CharField(max_length=20)
  404. def __str__(self):
  405. return self.name
  406. class Pizza(models.Model):
  407. name = models.CharField(max_length=20)
  408. toppings = models.ManyToManyField('Topping', related_name='pizzas')
  409. # Pizza's ModelAdmin has readonly_fields = ['toppings'].
  410. # toppings is editable for this model's admin.
  411. class ReadablePizza(Pizza):
  412. class Meta:
  413. proxy = True
  414. # No default permissions are created for this model and both name and toppings
  415. # are readonly for this model's admin.
  416. class ReadOnlyPizza(Pizza):
  417. class Meta:
  418. proxy = True
  419. default_permissions = ()
  420. class Album(models.Model):
  421. owner = models.ForeignKey(User, models.SET_NULL, null=True, blank=True)
  422. title = models.CharField(max_length=30)
  423. class Song(models.Model):
  424. name = models.CharField(max_length=20)
  425. album = models.ForeignKey(Album, on_delete=models.RESTRICT)
  426. def __str__(self):
  427. return self.name
  428. class Employee(Person):
  429. code = models.CharField(max_length=20)
  430. class Meta:
  431. ordering = ['name']
  432. class WorkHour(models.Model):
  433. datum = models.DateField()
  434. employee = models.ForeignKey(Employee, models.CASCADE)
  435. class Manager(Employee):
  436. """
  437. A multi-layer MTI child.
  438. """
  439. pass
  440. class Bonus(models.Model):
  441. recipient = models.ForeignKey(Manager, on_delete=models.CASCADE)
  442. class Question(models.Model):
  443. big_id = models.BigAutoField(primary_key=True)
  444. question = models.CharField(max_length=20)
  445. posted = models.DateField(default=datetime.date.today)
  446. expires = models.DateTimeField(null=True, blank=True)
  447. related_questions = models.ManyToManyField('self')
  448. uuid = models.UUIDField(default=uuid.uuid4, unique=True)
  449. def __str__(self):
  450. return self.question
  451. class Answer(models.Model):
  452. question = models.ForeignKey(Question, models.PROTECT)
  453. question_with_to_field = models.ForeignKey(
  454. Question, models.SET_NULL,
  455. blank=True, null=True, to_field='uuid',
  456. related_name='uuid_answers',
  457. limit_choices_to=~models.Q(question__istartswith='not'),
  458. )
  459. related_answers = models.ManyToManyField('self')
  460. answer = models.CharField(max_length=20)
  461. def __str__(self):
  462. return self.answer
  463. class Answer2(Answer):
  464. class Meta:
  465. proxy = True
  466. class Reservation(models.Model):
  467. start_date = models.DateTimeField()
  468. price = models.IntegerField()
  469. class FoodDelivery(models.Model):
  470. DRIVER_CHOICES = (
  471. ('bill', 'Bill G'),
  472. ('steve', 'Steve J'),
  473. )
  474. RESTAURANT_CHOICES = (
  475. ('indian', 'A Taste of India'),
  476. ('thai', 'Thai Pography'),
  477. ('pizza', 'Pizza Mama'),
  478. )
  479. reference = models.CharField(max_length=100)
  480. driver = models.CharField(max_length=100, choices=DRIVER_CHOICES, blank=True)
  481. restaurant = models.CharField(max_length=100, choices=RESTAURANT_CHOICES, blank=True)
  482. class Meta:
  483. unique_together = (("driver", "restaurant"),)
  484. class CoverLetter(models.Model):
  485. author = models.CharField(max_length=30)
  486. date_written = models.DateField(null=True, blank=True)
  487. def __str__(self):
  488. return self.author
  489. class Paper(models.Model):
  490. title = models.CharField(max_length=30)
  491. author = models.CharField(max_length=30, blank=True, null=True)
  492. class ShortMessage(models.Model):
  493. content = models.CharField(max_length=140)
  494. timestamp = models.DateTimeField(null=True, blank=True)
  495. class Telegram(models.Model):
  496. title = models.CharField(max_length=30)
  497. date_sent = models.DateField(null=True, blank=True)
  498. def __str__(self):
  499. return self.title
  500. class Story(models.Model):
  501. title = models.CharField(max_length=100)
  502. content = models.TextField()
  503. class OtherStory(models.Model):
  504. title = models.CharField(max_length=100)
  505. content = models.TextField()
  506. class ComplexSortedPerson(models.Model):
  507. name = models.CharField(max_length=100)
  508. age = models.PositiveIntegerField()
  509. is_employee = models.BooleanField(null=True)
  510. class PluggableSearchPerson(models.Model):
  511. name = models.CharField(max_length=100)
  512. age = models.PositiveIntegerField()
  513. class PrePopulatedPostLargeSlug(models.Model):
  514. """
  515. Regression test for #15938: a large max_length for the slugfield must not
  516. be localized in prepopulated_fields_js.html or it might end up breaking
  517. the JavaScript (ie, using THOUSAND_SEPARATOR ends up with maxLength=1,000)
  518. """
  519. title = models.CharField(max_length=100)
  520. published = models.BooleanField(default=False)
  521. # `db_index=False` because MySQL cannot index large CharField (#21196).
  522. slug = models.SlugField(max_length=1000, db_index=False)
  523. class AdminOrderedField(models.Model):
  524. order = models.IntegerField()
  525. stuff = models.CharField(max_length=200)
  526. class AdminOrderedModelMethod(models.Model):
  527. order = models.IntegerField()
  528. stuff = models.CharField(max_length=200)
  529. @admin.display(ordering='order')
  530. def some_order(self):
  531. return self.order
  532. class AdminOrderedAdminMethod(models.Model):
  533. order = models.IntegerField()
  534. stuff = models.CharField(max_length=200)
  535. class AdminOrderedCallable(models.Model):
  536. order = models.IntegerField()
  537. stuff = models.CharField(max_length=200)
  538. class Report(models.Model):
  539. title = models.CharField(max_length=100)
  540. def __str__(self):
  541. return self.title
  542. class MainPrepopulated(models.Model):
  543. name = models.CharField(max_length=100)
  544. pubdate = models.DateField()
  545. status = models.CharField(
  546. max_length=20,
  547. choices=(('option one', 'Option One'),
  548. ('option two', 'Option Two')))
  549. slug1 = models.SlugField(blank=True)
  550. slug2 = models.SlugField(blank=True)
  551. slug3 = models.SlugField(blank=True, allow_unicode=True)
  552. class RelatedPrepopulated(models.Model):
  553. parent = models.ForeignKey(MainPrepopulated, models.CASCADE)
  554. name = models.CharField(max_length=75)
  555. fk = models.ForeignKey('self', models.CASCADE, blank=True, null=True)
  556. m2m = models.ManyToManyField('self', blank=True)
  557. pubdate = models.DateField()
  558. status = models.CharField(
  559. max_length=20,
  560. choices=(('option one', 'Option One'),
  561. ('option two', 'Option Two')))
  562. slug1 = models.SlugField(max_length=50)
  563. slug2 = models.SlugField(max_length=60)
  564. class UnorderedObject(models.Model):
  565. """
  566. Model without any defined `Meta.ordering`.
  567. Refs #16819.
  568. """
  569. name = models.CharField(max_length=255)
  570. bool = models.BooleanField(default=True)
  571. class UndeletableObject(models.Model):
  572. """
  573. Model whose show_delete in admin change_view has been disabled
  574. Refs #10057.
  575. """
  576. name = models.CharField(max_length=255)
  577. class UnchangeableObject(models.Model):
  578. """
  579. Model whose change_view is disabled in admin
  580. Refs #20640.
  581. """
  582. class UserMessenger(models.Model):
  583. """
  584. Dummy class for testing message_user functions on ModelAdmin
  585. """
  586. class Simple(models.Model):
  587. """
  588. Simple model with nothing on it for use in testing
  589. """
  590. class Choice(models.Model):
  591. choice = models.IntegerField(
  592. blank=True, null=True,
  593. choices=((1, 'Yes'), (0, 'No'), (None, 'No opinion')),
  594. )
  595. class ParentWithDependentChildren(models.Model):
  596. """
  597. Issue #20522
  598. Model where the validation of child foreign-key relationships depends
  599. on validation of the parent
  600. """
  601. some_required_info = models.PositiveIntegerField()
  602. family_name = models.CharField(max_length=255, blank=False)
  603. class DependentChild(models.Model):
  604. """
  605. Issue #20522
  606. Model that depends on validation of the parent class for one of its
  607. fields to validate during clean
  608. """
  609. parent = models.ForeignKey(ParentWithDependentChildren, models.CASCADE)
  610. family_name = models.CharField(max_length=255)
  611. class _Manager(models.Manager):
  612. def get_queryset(self):
  613. return super().get_queryset().filter(pk__gt=1)
  614. class FilteredManager(models.Model):
  615. def __str__(self):
  616. return "PK=%d" % self.pk
  617. pk_gt_1 = _Manager()
  618. objects = models.Manager()
  619. class EmptyModelVisible(models.Model):
  620. """ See ticket #11277. """
  621. class EmptyModelHidden(models.Model):
  622. """ See ticket #11277. """
  623. class EmptyModelMixin(models.Model):
  624. """ See ticket #11277. """
  625. class State(models.Model):
  626. name = models.CharField(max_length=100, verbose_name='State verbose_name')
  627. class City(models.Model):
  628. state = models.ForeignKey(State, models.CASCADE)
  629. name = models.CharField(max_length=100, verbose_name='City verbose_name')
  630. def get_absolute_url(self):
  631. return '/dummy/%s/' % self.pk
  632. class Restaurant(models.Model):
  633. city = models.ForeignKey(City, models.CASCADE)
  634. name = models.CharField(max_length=100)
  635. def get_absolute_url(self):
  636. return '/dummy/%s/' % self.pk
  637. class Worker(models.Model):
  638. work_at = models.ForeignKey(Restaurant, models.CASCADE)
  639. name = models.CharField(max_length=50)
  640. surname = models.CharField(max_length=50)
  641. # Models for #23329
  642. class ReferencedByParent(models.Model):
  643. name = models.CharField(max_length=20, unique=True)
  644. class ParentWithFK(models.Model):
  645. fk = models.ForeignKey(
  646. ReferencedByParent,
  647. models.CASCADE,
  648. to_field='name',
  649. related_name='hidden+',
  650. )
  651. class ChildOfReferer(ParentWithFK):
  652. pass
  653. # Models for #23431
  654. class InlineReferer(models.Model):
  655. pass
  656. class ReferencedByInline(models.Model):
  657. name = models.CharField(max_length=20, unique=True)
  658. class InlineReference(models.Model):
  659. referer = models.ForeignKey(InlineReferer, models.CASCADE)
  660. fk = models.ForeignKey(
  661. ReferencedByInline,
  662. models.CASCADE,
  663. to_field='name',
  664. related_name='hidden+',
  665. )
  666. class Recipe(models.Model):
  667. rname = models.CharField(max_length=20, unique=True)
  668. class Ingredient(models.Model):
  669. iname = models.CharField(max_length=20, unique=True)
  670. recipes = models.ManyToManyField(Recipe, through='RecipeIngredient')
  671. class RecipeIngredient(models.Model):
  672. ingredient = models.ForeignKey(Ingredient, models.CASCADE, to_field='iname')
  673. recipe = models.ForeignKey(Recipe, models.CASCADE, to_field='rname')
  674. # Model for #23839
  675. class NotReferenced(models.Model):
  676. # Don't point any FK at this model.
  677. pass
  678. # Models for #23934
  679. class ExplicitlyProvidedPK(models.Model):
  680. name = models.IntegerField(primary_key=True)
  681. class ImplicitlyGeneratedPK(models.Model):
  682. name = models.IntegerField(unique=True)
  683. # Models for #25622
  684. class ReferencedByGenRel(models.Model):
  685. content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
  686. object_id = models.PositiveIntegerField()
  687. content_object = GenericForeignKey('content_type', 'object_id')
  688. class GenRelReference(models.Model):
  689. references = GenericRelation(ReferencedByGenRel)
  690. class ParentWithUUIDPK(models.Model):
  691. id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
  692. title = models.CharField(max_length=100)
  693. def __str__(self):
  694. return str(self.id)
  695. class RelatedWithUUIDPKModel(models.Model):
  696. parent = models.ForeignKey(ParentWithUUIDPK, on_delete=models.SET_NULL, null=True, blank=True)
  697. class Author(models.Model):
  698. pass
  699. class Authorship(models.Model):
  700. book = models.ForeignKey(Book, models.CASCADE)
  701. author = models.ForeignKey(Author, models.CASCADE)
  702. class UserProxy(User):
  703. """Proxy a model with a different app_label."""
  704. class Meta:
  705. proxy = True
  706. class ReadOnlyRelatedField(models.Model):
  707. chapter = models.ForeignKey(Chapter, models.CASCADE)
  708. language = models.ForeignKey(Language, models.CASCADE)
  709. user = models.ForeignKey(User, models.CASCADE)