models.py 8.0 KB

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