models.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  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, 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
  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 #11428
  47. @python_2_unicode_compatible
  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. @python_2_unicode_compatible
  62. class Store(models.Model):
  63. objects = TestManager()
  64. name = models.CharField(max_length=255)
  65. main = models.ForeignKey('self', null=True)
  66. class Meta:
  67. ordering = ('name',)
  68. def __str__(self):
  69. return self.name
  70. def natural_key(self):
  71. return (self.name,)
  72. @python_2_unicode_compatible
  73. class Person(models.Model):
  74. objects = TestManager()
  75. name = models.CharField(max_length=255)
  76. class Meta:
  77. ordering = ('name',)
  78. def __str__(self):
  79. return self.name
  80. # Person doesn't actually have a dependency on store, but we need to define
  81. # one to test the behavior of the dependency resolution algorithm.
  82. def natural_key(self):
  83. return (self.name,)
  84. natural_key.dependencies = ['fixtures_regress.store']
  85. @python_2_unicode_compatible
  86. class Book(models.Model):
  87. name = models.CharField(max_length=255)
  88. author = models.ForeignKey(Person)
  89. stores = models.ManyToManyField(Store)
  90. class Meta:
  91. ordering = ('name',)
  92. def __str__(self):
  93. return '%s by %s (available at %s)' % (
  94. self.name,
  95. self.author.name,
  96. ', '.join(s.name for s in self.stores.all())
  97. )
  98. class NKManager(models.Manager):
  99. def get_by_natural_key(self, data):
  100. return self.get(data=data)
  101. @python_2_unicode_compatible
  102. class NKChild(Parent):
  103. data = models.CharField(max_length=10, unique=True)
  104. objects = NKManager()
  105. def natural_key(self):
  106. return self.data
  107. def __str__(self):
  108. return 'NKChild %s:%s' % (self.name, self.data)
  109. @python_2_unicode_compatible
  110. class RefToNKChild(models.Model):
  111. text = models.CharField(max_length=10)
  112. nk_fk = models.ForeignKey(NKChild, related_name='ref_fks')
  113. nk_m2m = models.ManyToManyField(NKChild, related_name='ref_m2ms')
  114. def __str__(self):
  115. return '%s: Reference to %s [%s]' % (
  116. self.text,
  117. self.nk_fk,
  118. ', '.join(str(o) for o in self.nk_m2m.all())
  119. )
  120. # ome models with pathological circular dependencies
  121. class Circle1(models.Model):
  122. name = models.CharField(max_length=255)
  123. def natural_key(self):
  124. return self.name
  125. natural_key.dependencies = ['fixtures_regress.circle2']
  126. class Circle2(models.Model):
  127. name = models.CharField(max_length=255)
  128. def natural_key(self):
  129. return self.name
  130. natural_key.dependencies = ['fixtures_regress.circle1']
  131. class Circle3(models.Model):
  132. name = models.CharField(max_length=255)
  133. def natural_key(self):
  134. return self.name
  135. natural_key.dependencies = ['fixtures_regress.circle3']
  136. class Circle4(models.Model):
  137. name = models.CharField(max_length=255)
  138. def natural_key(self):
  139. return self.name
  140. natural_key.dependencies = ['fixtures_regress.circle5']
  141. class Circle5(models.Model):
  142. name = models.CharField(max_length=255)
  143. def natural_key(self):
  144. return self.name
  145. natural_key.dependencies = ['fixtures_regress.circle6']
  146. class Circle6(models.Model):
  147. name = models.CharField(max_length=255)
  148. def natural_key(self):
  149. return self.name
  150. natural_key.dependencies = ['fixtures_regress.circle4']
  151. class ExternalDependency(models.Model):
  152. name = models.CharField(max_length=255)
  153. def natural_key(self):
  154. return self.name
  155. natural_key.dependencies = ['fixtures_regress.book']
  156. # Model for regression test of #11101
  157. class Thingy(models.Model):
  158. name = models.CharField(max_length=255)