data.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. """
  2. ******** Models for test_data.py ***********
  3. The following classes are for testing basic data marshalling, including
  4. NULL values, where allowed.
  5. The basic idea is to have a model for each Django data type.
  6. """
  7. from __future__ import unicode_literals
  8. from django.contrib.contenttypes.fields import (
  9. GenericForeignKey, GenericRelation,
  10. )
  11. from django.contrib.contenttypes.models import ContentType
  12. from django.db import models
  13. from .base import BaseModel
  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)
  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 GenericIPAddressData(models.Model):
  41. data = models.GenericIPAddressField(null=True)
  42. class NullBooleanData(models.Model):
  43. data = models.NullBooleanField(null=True)
  44. class PositiveIntegerData(models.Model):
  45. data = models.PositiveIntegerField(null=True)
  46. class PositiveSmallIntegerData(models.Model):
  47. data = models.PositiveSmallIntegerField(null=True)
  48. class SlugData(models.Model):
  49. data = models.SlugField(null=True)
  50. class SmallData(models.Model):
  51. data = models.SmallIntegerField(null=True)
  52. class TextData(models.Model):
  53. data = models.TextField(null=True)
  54. class TimeData(models.Model):
  55. data = models.TimeField(null=True)
  56. class Tag(models.Model):
  57. """A tag on an item."""
  58. data = models.SlugField()
  59. content_type = models.ForeignKey(ContentType, models.CASCADE)
  60. object_id = models.PositiveIntegerField()
  61. content_object = GenericForeignKey()
  62. class Meta:
  63. ordering = ["data"]
  64. class GenericData(models.Model):
  65. data = models.CharField(max_length=30)
  66. tags = GenericRelation(Tag)
  67. # The following test classes are all for validation
  68. # of related objects; in particular, forward, backward,
  69. # and self references.
  70. class Anchor(models.Model):
  71. """This is a model that can be used as
  72. something for other models to point at"""
  73. data = models.CharField(max_length=30)
  74. class Meta:
  75. ordering = ('id',)
  76. class UniqueAnchor(models.Model):
  77. """This is a model that can be used as
  78. something for other models to point at"""
  79. data = models.CharField(unique=True, max_length=30)
  80. class FKData(models.Model):
  81. data = models.ForeignKey(Anchor, models.SET_NULL, null=True)
  82. class M2MData(models.Model):
  83. data = models.ManyToManyField(Anchor)
  84. class O2OData(models.Model):
  85. # One to one field can't be null here, since it is a PK.
  86. data = models.OneToOneField(Anchor, models.CASCADE, primary_key=True)
  87. class FKSelfData(models.Model):
  88. data = models.ForeignKey('self', models.CASCADE, null=True)
  89. class M2MSelfData(models.Model):
  90. data = models.ManyToManyField('self', symmetrical=False)
  91. class FKDataToField(models.Model):
  92. data = models.ForeignKey(UniqueAnchor, models.SET_NULL, null=True, to_field='data')
  93. class FKDataToO2O(models.Model):
  94. data = models.ForeignKey(O2OData, models.SET_NULL, null=True)
  95. class M2MIntermediateData(models.Model):
  96. data = models.ManyToManyField(Anchor, through='Intermediate')
  97. class Intermediate(models.Model):
  98. left = models.ForeignKey(M2MIntermediateData, models.CASCADE)
  99. right = models.ForeignKey(Anchor, models.CASCADE)
  100. extra = models.CharField(max_length=30, blank=True, default="doesn't matter")
  101. # The following test classes are for validating the
  102. # deserialization of objects that use a user-defined
  103. # field as the primary key.
  104. # Some of these data types have been commented out
  105. # because they can't be used as a primary key on one
  106. # or all database backends.
  107. class BooleanPKData(models.Model):
  108. data = models.BooleanField(primary_key=True, default=False)
  109. class CharPKData(models.Model):
  110. data = models.CharField(max_length=30, primary_key=True)
  111. # class DatePKData(models.Model):
  112. # data = models.DateField(primary_key=True)
  113. # class DateTimePKData(models.Model):
  114. # data = models.DateTimeField(primary_key=True)
  115. class DecimalPKData(models.Model):
  116. data = models.DecimalField(primary_key=True, decimal_places=3, max_digits=5)
  117. class EmailPKData(models.Model):
  118. data = models.EmailField(primary_key=True)
  119. # class FilePKData(models.Model):
  120. # data = models.FileField(primary_key=True)
  121. class FilePathPKData(models.Model):
  122. data = models.FilePathField(primary_key=True)
  123. class FloatPKData(models.Model):
  124. data = models.FloatField(primary_key=True)
  125. class IntegerPKData(models.Model):
  126. data = models.IntegerField(primary_key=True)
  127. # class ImagePKData(models.Model):
  128. # data = models.ImageField(primary_key=True)
  129. class GenericIPAddressPKData(models.Model):
  130. data = models.GenericIPAddressField(primary_key=True)
  131. # This is just a Boolean field with null=True, and we can't test a PK value of NULL.
  132. # class NullBooleanPKData(models.Model):
  133. # data = models.NullBooleanField(primary_key=True)
  134. class PositiveIntegerPKData(models.Model):
  135. data = models.PositiveIntegerField(primary_key=True)
  136. class PositiveSmallIntegerPKData(models.Model):
  137. data = models.PositiveSmallIntegerField(primary_key=True)
  138. class SlugPKData(models.Model):
  139. data = models.SlugField(primary_key=True)
  140. class SmallPKData(models.Model):
  141. data = models.SmallIntegerField(primary_key=True)
  142. # class TextPKData(models.Model):
  143. # data = models.TextField(primary_key=True)
  144. # class TimePKData(models.Model):
  145. # data = models.TimeField(primary_key=True)
  146. class UUIDData(models.Model):
  147. data = models.UUIDField(primary_key=True)
  148. class FKToUUID(models.Model):
  149. data = models.ForeignKey(UUIDData, models.CASCADE)
  150. # Tests for handling fields with pre_save functions, or
  151. # models with save functions that modify data
  152. class AutoNowDateTimeData(models.Model):
  153. data = models.DateTimeField(null=True, auto_now=True)
  154. class ModifyingSaveData(models.Model):
  155. data = models.IntegerField(null=True)
  156. def save(self, *args, **kwargs):
  157. """
  158. A save method that modifies the data in the object.
  159. A user-defined save() method isn't called when objects are deserialized
  160. (#4459).
  161. """
  162. self.data = 666
  163. super(ModifyingSaveData, self).save(*args, **kwargs)
  164. # Tests for serialization of models using inheritance.
  165. # Regression for #7202, #7350
  166. class AbstractBaseModel(models.Model):
  167. parent_data = models.IntegerField()
  168. class Meta:
  169. abstract = True
  170. class InheritAbstractModel(AbstractBaseModel):
  171. child_data = models.IntegerField()
  172. class InheritBaseModel(BaseModel):
  173. child_data = models.IntegerField()
  174. class ExplicitInheritBaseModel(BaseModel):
  175. parent = models.OneToOneField(BaseModel, models.CASCADE, parent_link=True)
  176. child_data = models.IntegerField()
  177. class LengthModel(models.Model):
  178. data = models.IntegerField()
  179. def __len__(self):
  180. return self.data