models.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. """
  2. A test spanning all the capabilities of all the serializers.
  3. This class sets up a model for each model field type
  4. (except for image types, because of the Pillow dependency).
  5. """
  6. import warnings
  7. from django.db import models
  8. from django.contrib.contenttypes.fields import (
  9. GenericForeignKey, GenericRelation
  10. )
  11. from django.contrib.contenttypes.models import ContentType
  12. # The following classes are for testing basic data
  13. # marshalling, including NULL values, where allowed.
  14. class BinaryData(models.Model):
  15. data = models.BinaryField(null=True)
  16. class BooleanData(models.Model):
  17. data = models.BooleanField(default=False)
  18. class CharData(models.Model):
  19. data = models.CharField(max_length=30, null=True)
  20. class DateData(models.Model):
  21. data = models.DateField(null=True)
  22. class DateTimeData(models.Model):
  23. data = models.DateTimeField(null=True)
  24. class DecimalData(models.Model):
  25. data = models.DecimalField(null=True, decimal_places=3, max_digits=5)
  26. class EmailData(models.Model):
  27. data = models.EmailField(null=True)
  28. class FileData(models.Model):
  29. data = models.FileField(null=True, upload_to='/foo/bar')
  30. class FilePathData(models.Model):
  31. data = models.FilePathField(null=True)
  32. class FloatData(models.Model):
  33. data = models.FloatField(null=True)
  34. class IntegerData(models.Model):
  35. data = models.IntegerField(null=True)
  36. class BigIntegerData(models.Model):
  37. data = models.BigIntegerField(null=True)
  38. # class ImageData(models.Model):
  39. # data = models.ImageField(null=True)
  40. class IPAddressData(models.Model):
  41. with warnings.catch_warnings(record=True) as w:
  42. warnings.simplefilter("always")
  43. data = models.IPAddressField(null=True)
  44. class GenericIPAddressData(models.Model):
  45. data = models.GenericIPAddressField(null=True)
  46. class NullBooleanData(models.Model):
  47. data = models.NullBooleanField(null=True)
  48. class PositiveIntegerData(models.Model):
  49. data = models.PositiveIntegerField(null=True)
  50. class PositiveSmallIntegerData(models.Model):
  51. data = models.PositiveSmallIntegerField(null=True)
  52. class SlugData(models.Model):
  53. data = models.SlugField(null=True)
  54. class SmallData(models.Model):
  55. data = models.SmallIntegerField(null=True)
  56. class TextData(models.Model):
  57. data = models.TextField(null=True)
  58. class TimeData(models.Model):
  59. data = models.TimeField(null=True)
  60. class Tag(models.Model):
  61. """A tag on an item."""
  62. data = models.SlugField()
  63. content_type = models.ForeignKey(ContentType)
  64. object_id = models.PositiveIntegerField()
  65. content_object = GenericForeignKey()
  66. class Meta:
  67. ordering = ["data"]
  68. class GenericData(models.Model):
  69. data = models.CharField(max_length=30)
  70. tags = GenericRelation(Tag)
  71. # The following test classes are all for validation
  72. # of related objects; in particular, forward, backward,
  73. # and self references.
  74. class Anchor(models.Model):
  75. """This is a model that can be used as
  76. something for other models to point at"""
  77. data = models.CharField(max_length=30)
  78. class Meta:
  79. ordering = ('id',)
  80. class NaturalKeyAnchorManager(models.Manager):
  81. def get_by_natural_key(self, data):
  82. return self.get(data=data)
  83. class NaturalKeyAnchor(models.Model):
  84. objects = NaturalKeyAnchorManager()
  85. data = models.CharField(max_length=100, unique=True)
  86. title = models.CharField(max_length=100, null=True)
  87. def natural_key(self):
  88. return (self.data,)
  89. class UniqueAnchor(models.Model):
  90. """This is a model that can be used as
  91. something for other models to point at"""
  92. data = models.CharField(unique=True, max_length=30)
  93. class FKData(models.Model):
  94. data = models.ForeignKey(Anchor, null=True)
  95. class FKDataNaturalKey(models.Model):
  96. data = models.ForeignKey(NaturalKeyAnchor, null=True)
  97. class M2MData(models.Model):
  98. data = models.ManyToManyField(Anchor, null=True)
  99. class O2OData(models.Model):
  100. # One to one field can't be null here, since it is a PK.
  101. data = models.OneToOneField(Anchor, primary_key=True)
  102. class FKSelfData(models.Model):
  103. data = models.ForeignKey('self', null=True)
  104. class M2MSelfData(models.Model):
  105. data = models.ManyToManyField('self', null=True, symmetrical=False)
  106. class FKDataToField(models.Model):
  107. data = models.ForeignKey(UniqueAnchor, null=True, to_field='data')
  108. class FKDataToO2O(models.Model):
  109. data = models.ForeignKey(O2OData, null=True)
  110. class M2MIntermediateData(models.Model):
  111. data = models.ManyToManyField(Anchor, null=True, through='Intermediate')
  112. class Intermediate(models.Model):
  113. left = models.ForeignKey(M2MIntermediateData)
  114. right = models.ForeignKey(Anchor)
  115. extra = models.CharField(max_length=30, blank=True, default="doesn't matter")
  116. # The following test classes are for validating the
  117. # deserialization of objects that use a user-defined
  118. # field as the primary key.
  119. # Some of these data types have been commented out
  120. # because they can't be used as a primary key on one
  121. # or all database backends.
  122. class BooleanPKData(models.Model):
  123. data = models.BooleanField(primary_key=True, default=False)
  124. class CharPKData(models.Model):
  125. data = models.CharField(max_length=30, primary_key=True)
  126. # class DatePKData(models.Model):
  127. # data = models.DateField(primary_key=True)
  128. # class DateTimePKData(models.Model):
  129. # data = models.DateTimeField(primary_key=True)
  130. class DecimalPKData(models.Model):
  131. data = models.DecimalField(primary_key=True, decimal_places=3, max_digits=5)
  132. class EmailPKData(models.Model):
  133. data = models.EmailField(primary_key=True)
  134. # class FilePKData(models.Model):
  135. # data = models.FileField(primary_key=True, upload_to='/foo/bar')
  136. class FilePathPKData(models.Model):
  137. data = models.FilePathField(primary_key=True)
  138. class FloatPKData(models.Model):
  139. data = models.FloatField(primary_key=True)
  140. class IntegerPKData(models.Model):
  141. data = models.IntegerField(primary_key=True)
  142. # class ImagePKData(models.Model):
  143. # data = models.ImageField(primary_key=True)
  144. class IPAddressPKData(models.Model):
  145. with warnings.catch_warnings(record=True) as w:
  146. warnings.simplefilter("always")
  147. data = models.IPAddressField(primary_key=True)
  148. class GenericIPAddressPKData(models.Model):
  149. data = models.GenericIPAddressField(primary_key=True)
  150. # This is just a Boolean field with null=True, and we can't test a PK value of NULL.
  151. # class NullBooleanPKData(models.Model):
  152. # data = models.NullBooleanField(primary_key=True)
  153. class PositiveIntegerPKData(models.Model):
  154. data = models.PositiveIntegerField(primary_key=True)
  155. class PositiveSmallIntegerPKData(models.Model):
  156. data = models.PositiveSmallIntegerField(primary_key=True)
  157. class SlugPKData(models.Model):
  158. data = models.SlugField(primary_key=True)
  159. class SmallPKData(models.Model):
  160. data = models.SmallIntegerField(primary_key=True)
  161. # class TextPKData(models.Model):
  162. # data = models.TextField(primary_key=True)
  163. # class TimePKData(models.Model):
  164. # data = models.TimeField(primary_key=True)
  165. class ComplexModel(models.Model):
  166. field1 = models.CharField(max_length=10)
  167. field2 = models.CharField(max_length=10)
  168. field3 = models.CharField(max_length=10)
  169. # Tests for handling fields with pre_save functions, or
  170. # models with save functions that modify data
  171. class AutoNowDateTimeData(models.Model):
  172. data = models.DateTimeField(null=True, auto_now=True)
  173. class ModifyingSaveData(models.Model):
  174. data = models.IntegerField(null=True)
  175. def save(self, *args, **kwargs):
  176. """
  177. A save method that modifies the data in the object.
  178. Verifies that a user-defined save() method isn't called when objects
  179. are deserialized (#4459).
  180. """
  181. self.data = 666
  182. super(ModifyingSaveData, self).save(*args, **kwargs)
  183. # Tests for serialization of models using inheritance.
  184. # Regression for #7202, #7350
  185. class AbstractBaseModel(models.Model):
  186. parent_data = models.IntegerField()
  187. class Meta:
  188. abstract = True
  189. class InheritAbstractModel(AbstractBaseModel):
  190. child_data = models.IntegerField()
  191. class BaseModel(models.Model):
  192. parent_data = models.IntegerField()
  193. class InheritBaseModel(BaseModel):
  194. child_data = models.IntegerField()
  195. class ExplicitInheritBaseModel(BaseModel):
  196. parent = models.OneToOneField(BaseModel)
  197. child_data = models.IntegerField()
  198. class ProxyBaseModel(BaseModel):
  199. class Meta:
  200. proxy = True
  201. class ProxyProxyBaseModel(ProxyBaseModel):
  202. class Meta:
  203. proxy = True
  204. class LengthModel(models.Model):
  205. data = models.IntegerField()
  206. def __len__(self):
  207. return self.data