models.py 28 KB

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