models.py 25 KB

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