models.py 24 KB

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