models.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. from __future__ import unicode_literals
  2. from django.contrib.auth.models import User
  3. from django.db import models
  4. from django.utils import six
  5. from django.utils.encoding import python_2_unicode_compatible
  6. @python_2_unicode_compatible
  7. class Animal(models.Model):
  8. name = models.CharField(max_length=150)
  9. latin_name = models.CharField(max_length=150)
  10. count = models.IntegerField()
  11. weight = models.FloatField()
  12. # use a non-default name for the default manager
  13. specimens = models.Manager()
  14. def __str__(self):
  15. return self.name
  16. class Plant(models.Model):
  17. name = models.CharField(max_length=150)
  18. class Meta:
  19. # For testing when upper case letter in app name; regression for #4057
  20. db_table = "Fixtures_regress_plant"
  21. @python_2_unicode_compatible
  22. class Stuff(models.Model):
  23. name = models.CharField(max_length=20, null=True)
  24. owner = models.ForeignKey(User, models.SET_NULL, null=True)
  25. def __str__(self):
  26. return six.text_type(self.name) + ' is owned by ' + six.text_type(self.owner)
  27. class Absolute(models.Model):
  28. name = models.CharField(max_length=40)
  29. class Parent(models.Model):
  30. name = models.CharField(max_length=10)
  31. class Meta:
  32. ordering = ('id',)
  33. class Child(Parent):
  34. data = models.CharField(max_length=10)
  35. # Models to regression test #7572, #20820
  36. class Channel(models.Model):
  37. name = models.CharField(max_length=255)
  38. class Article(models.Model):
  39. title = models.CharField(max_length=255)
  40. channels = models.ManyToManyField(Channel)
  41. class Meta:
  42. ordering = ('id',)
  43. # Subclass of a model with a ManyToManyField for test_ticket_20820
  44. class SpecialArticle(Article):
  45. pass
  46. # Models to regression test #22421
  47. class CommonFeature(Article):
  48. class Meta:
  49. abstract = True
  50. class Feature(CommonFeature):
  51. pass
  52. # Models to regression test #11428
  53. @python_2_unicode_compatible
  54. class Widget(models.Model):
  55. name = models.CharField(max_length=255)
  56. class Meta:
  57. ordering = ('name',)
  58. def __str__(self):
  59. return self.name
  60. class WidgetProxy(Widget):
  61. class Meta:
  62. proxy = True
  63. # Check for forward references in FKs and M2Ms with natural keys
  64. class TestManager(models.Manager):
  65. def get_by_natural_key(self, key):
  66. return self.get(name=key)
  67. @python_2_unicode_compatible
  68. class Store(models.Model):
  69. objects = TestManager()
  70. name = models.CharField(max_length=255)
  71. main = models.ForeignKey('self', models.SET_NULL, null=True)
  72. class Meta:
  73. ordering = ('name',)
  74. def __str__(self):
  75. return self.name
  76. def natural_key(self):
  77. return (self.name,)
  78. @python_2_unicode_compatible
  79. class Person(models.Model):
  80. objects = TestManager()
  81. name = models.CharField(max_length=255)
  82. class Meta:
  83. ordering = ('name',)
  84. def __str__(self):
  85. return self.name
  86. # Person doesn't actually have a dependency on store, but we need to define
  87. # one to test the behavior of the dependency resolution algorithm.
  88. def natural_key(self):
  89. return (self.name,)
  90. natural_key.dependencies = ['fixtures_regress.store']
  91. @python_2_unicode_compatible
  92. class Book(models.Model):
  93. name = models.CharField(max_length=255)
  94. author = models.ForeignKey(Person, models.CASCADE)
  95. stores = models.ManyToManyField(Store)
  96. class Meta:
  97. ordering = ('name',)
  98. def __str__(self):
  99. return '%s by %s (available at %s)' % (
  100. self.name,
  101. self.author.name,
  102. ', '.join(s.name for s in self.stores.all())
  103. )
  104. class NKManager(models.Manager):
  105. def get_by_natural_key(self, data):
  106. return self.get(data=data)
  107. @python_2_unicode_compatible
  108. class NKChild(Parent):
  109. data = models.CharField(max_length=10, unique=True)
  110. objects = NKManager()
  111. def natural_key(self):
  112. return (self.data,)
  113. def __str__(self):
  114. return 'NKChild %s:%s' % (self.name, self.data)
  115. @python_2_unicode_compatible
  116. class RefToNKChild(models.Model):
  117. text = models.CharField(max_length=10)
  118. nk_fk = models.ForeignKey(NKChild, models.CASCADE, related_name='ref_fks')
  119. nk_m2m = models.ManyToManyField(NKChild, related_name='ref_m2ms')
  120. def __str__(self):
  121. return '%s: Reference to %s [%s]' % (
  122. self.text,
  123. self.nk_fk,
  124. ', '.join(str(o) for o in self.nk_m2m.all())
  125. )
  126. # ome models with pathological circular dependencies
  127. class Circle1(models.Model):
  128. name = models.CharField(max_length=255)
  129. def natural_key(self):
  130. return (self.name,)
  131. natural_key.dependencies = ['fixtures_regress.circle2']
  132. class Circle2(models.Model):
  133. name = models.CharField(max_length=255)
  134. def natural_key(self):
  135. return (self.name,)
  136. natural_key.dependencies = ['fixtures_regress.circle1']
  137. class Circle3(models.Model):
  138. name = models.CharField(max_length=255)
  139. def natural_key(self):
  140. return (self.name,)
  141. natural_key.dependencies = ['fixtures_regress.circle3']
  142. class Circle4(models.Model):
  143. name = models.CharField(max_length=255)
  144. def natural_key(self):
  145. return (self.name,)
  146. natural_key.dependencies = ['fixtures_regress.circle5']
  147. class Circle5(models.Model):
  148. name = models.CharField(max_length=255)
  149. def natural_key(self):
  150. return (self.name,)
  151. natural_key.dependencies = ['fixtures_regress.circle6']
  152. class Circle6(models.Model):
  153. name = models.CharField(max_length=255)
  154. def natural_key(self):
  155. return (self.name,)
  156. natural_key.dependencies = ['fixtures_regress.circle4']
  157. class ExternalDependency(models.Model):
  158. name = models.CharField(max_length=255)
  159. def natural_key(self):
  160. return (self.name,)
  161. natural_key.dependencies = ['fixtures_regress.book']
  162. # Model for regression test of #11101
  163. class Thingy(models.Model):
  164. name = models.CharField(max_length=255)
  165. class M2MToSelf(models.Model):
  166. parent = models.ManyToManyField("self", blank=True)
  167. @python_2_unicode_compatible
  168. class BaseNKModel(models.Model):
  169. """
  170. Base model with a natural_key and a manager with `get_by_natural_key`
  171. """
  172. data = models.CharField(max_length=20, unique=True)
  173. objects = NKManager()
  174. class Meta:
  175. abstract = True
  176. def __str__(self):
  177. return self.data
  178. def natural_key(self):
  179. return (self.data,)
  180. class M2MSimpleA(BaseNKModel):
  181. b_set = models.ManyToManyField("M2MSimpleB")
  182. class M2MSimpleB(BaseNKModel):
  183. pass
  184. class M2MSimpleCircularA(BaseNKModel):
  185. b_set = models.ManyToManyField("M2MSimpleCircularB")
  186. class M2MSimpleCircularB(BaseNKModel):
  187. a_set = models.ManyToManyField("M2MSimpleCircularA")
  188. class M2MComplexA(BaseNKModel):
  189. b_set = models.ManyToManyField("M2MComplexB", through="M2MThroughAB")
  190. class M2MComplexB(BaseNKModel):
  191. pass
  192. class M2MThroughAB(BaseNKModel):
  193. a = models.ForeignKey(M2MComplexA, models.CASCADE)
  194. b = models.ForeignKey(M2MComplexB, models.CASCADE)
  195. class M2MComplexCircular1A(BaseNKModel):
  196. b_set = models.ManyToManyField("M2MComplexCircular1B",
  197. through="M2MCircular1ThroughAB")
  198. class M2MComplexCircular1B(BaseNKModel):
  199. c_set = models.ManyToManyField("M2MComplexCircular1C",
  200. through="M2MCircular1ThroughBC")
  201. class M2MComplexCircular1C(BaseNKModel):
  202. a_set = models.ManyToManyField("M2MComplexCircular1A",
  203. through="M2MCircular1ThroughCA")
  204. class M2MCircular1ThroughAB(BaseNKModel):
  205. a = models.ForeignKey(M2MComplexCircular1A, models.CASCADE)
  206. b = models.ForeignKey(M2MComplexCircular1B, models.CASCADE)
  207. class M2MCircular1ThroughBC(BaseNKModel):
  208. b = models.ForeignKey(M2MComplexCircular1B, models.CASCADE)
  209. c = models.ForeignKey(M2MComplexCircular1C, models.CASCADE)
  210. class M2MCircular1ThroughCA(BaseNKModel):
  211. c = models.ForeignKey(M2MComplexCircular1C, models.CASCADE)
  212. a = models.ForeignKey(M2MComplexCircular1A, models.CASCADE)
  213. class M2MComplexCircular2A(BaseNKModel):
  214. b_set = models.ManyToManyField("M2MComplexCircular2B",
  215. through="M2MCircular2ThroughAB")
  216. class M2MComplexCircular2B(BaseNKModel):
  217. def natural_key(self):
  218. return (self.data,)
  219. # Fake the dependency for a circularity
  220. natural_key.dependencies = ["fixtures_regress.M2MComplexCircular2A"]
  221. class M2MCircular2ThroughAB(BaseNKModel):
  222. a = models.ForeignKey(M2MComplexCircular2A, models.CASCADE)
  223. b = models.ForeignKey(M2MComplexCircular2B, models.CASCADE)