models.py 25 KB

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