parts/django/tests/regressiontests/serializers_regress/models.py
changeset 69 c6bca38c1cbf
equal deleted inserted replaced
68:5ff1fc726848 69:c6bca38c1cbf
       
     1 """
       
     2 A test spanning all the capabilities of all the serializers.
       
     3 
       
     4 This class sets up a model for each model field type
       
     5 (except for image types, because of the PIL dependency).
       
     6 """
       
     7 
       
     8 from django.db import models
       
     9 from django.contrib.contenttypes import generic
       
    10 from django.contrib.contenttypes.models import ContentType
       
    11 from django.contrib.localflavor.us.models import USStateField, PhoneNumberField
       
    12 
       
    13 # The following classes are for testing basic data
       
    14 # marshalling, including NULL values, where allowed.
       
    15 
       
    16 class BooleanData(models.Model):
       
    17     data = models.BooleanField()
       
    18 
       
    19 class CharData(models.Model):
       
    20     data = models.CharField(max_length=30, null=True)
       
    21 
       
    22 class DateData(models.Model):
       
    23     data = models.DateField(null=True)
       
    24 
       
    25 class DateTimeData(models.Model):
       
    26     data = models.DateTimeField(null=True)
       
    27 
       
    28 class DecimalData(models.Model):
       
    29     data = models.DecimalField(null=True, decimal_places=3, max_digits=5)
       
    30 
       
    31 class EmailData(models.Model):
       
    32     data = models.EmailField(null=True)
       
    33 
       
    34 class FileData(models.Model):
       
    35     data = models.FileField(null=True, upload_to='/foo/bar')
       
    36 
       
    37 class FilePathData(models.Model):
       
    38     data = models.FilePathField(null=True)
       
    39 
       
    40 class FloatData(models.Model):
       
    41     data = models.FloatField(null=True)
       
    42 
       
    43 class IntegerData(models.Model):
       
    44     data = models.IntegerField(null=True)
       
    45 
       
    46 class BigIntegerData(models.Model):
       
    47     data = models.BigIntegerField(null=True)
       
    48 
       
    49 # class ImageData(models.Model):
       
    50 #    data = models.ImageField(null=True)
       
    51 
       
    52 class IPAddressData(models.Model):
       
    53     data = models.IPAddressField(null=True)
       
    54 
       
    55 class NullBooleanData(models.Model):
       
    56     data = models.NullBooleanField(null=True)
       
    57 
       
    58 class PhoneData(models.Model):
       
    59     data = PhoneNumberField(null=True)
       
    60 
       
    61 class PositiveIntegerData(models.Model):
       
    62     data = models.PositiveIntegerField(null=True)
       
    63 
       
    64 class PositiveSmallIntegerData(models.Model):
       
    65     data = models.PositiveSmallIntegerField(null=True)
       
    66 
       
    67 class SlugData(models.Model):
       
    68     data = models.SlugField(null=True)
       
    69 
       
    70 class SmallData(models.Model):
       
    71     data = models.SmallIntegerField(null=True)
       
    72 
       
    73 class TextData(models.Model):
       
    74     data = models.TextField(null=True)
       
    75 
       
    76 class TimeData(models.Model):
       
    77     data = models.TimeField(null=True)
       
    78 
       
    79 class USStateData(models.Model):
       
    80     data = USStateField(null=True)
       
    81 
       
    82 class XMLData(models.Model):
       
    83     data = models.XMLField(null=True)
       
    84 
       
    85 class Tag(models.Model):
       
    86     """A tag on an item."""
       
    87     data = models.SlugField()
       
    88     content_type = models.ForeignKey(ContentType)
       
    89     object_id = models.PositiveIntegerField()
       
    90 
       
    91     content_object = generic.GenericForeignKey()
       
    92 
       
    93     class Meta:
       
    94         ordering = ["data"]
       
    95 
       
    96 class GenericData(models.Model):
       
    97     data = models.CharField(max_length=30)
       
    98 
       
    99     tags = generic.GenericRelation(Tag)
       
   100 
       
   101 # The following test classes are all for validation
       
   102 # of related objects; in particular, forward, backward,
       
   103 # and self references.
       
   104 
       
   105 class Anchor(models.Model):
       
   106     """This is a model that can be used as
       
   107     something for other models to point at"""
       
   108 
       
   109     data = models.CharField(max_length=30)
       
   110 
       
   111     class Meta:
       
   112         ordering = ('id',)
       
   113 
       
   114 class UniqueAnchor(models.Model):
       
   115     """This is a model that can be used as
       
   116     something for other models to point at"""
       
   117 
       
   118     data = models.CharField(unique=True, max_length=30)
       
   119 
       
   120 class FKData(models.Model):
       
   121     data = models.ForeignKey(Anchor, null=True)
       
   122 
       
   123 class M2MData(models.Model):
       
   124     data = models.ManyToManyField(Anchor, null=True)
       
   125 
       
   126 class O2OData(models.Model):
       
   127     # One to one field can't be null here, since it is a PK.
       
   128     data = models.OneToOneField(Anchor, primary_key=True)
       
   129 
       
   130 class FKSelfData(models.Model):
       
   131     data = models.ForeignKey('self', null=True)
       
   132 
       
   133 class M2MSelfData(models.Model):
       
   134     data = models.ManyToManyField('self', null=True, symmetrical=False)
       
   135 
       
   136 class FKDataToField(models.Model):
       
   137     data = models.ForeignKey(UniqueAnchor, null=True, to_field='data')
       
   138 
       
   139 class FKDataToO2O(models.Model):
       
   140     data = models.ForeignKey(O2OData, null=True)
       
   141 
       
   142 class M2MIntermediateData(models.Model):
       
   143     data = models.ManyToManyField(Anchor, null=True, through='Intermediate')
       
   144 
       
   145 class Intermediate(models.Model):
       
   146     left = models.ForeignKey(M2MIntermediateData)
       
   147     right = models.ForeignKey(Anchor)
       
   148     extra = models.CharField(max_length=30, blank=True, default="doesn't matter")
       
   149 
       
   150 # The following test classes are for validating the
       
   151 # deserialization of objects that use a user-defined
       
   152 # field as the primary key.
       
   153 # Some of these data types have been commented out
       
   154 # because they can't be used as a primary key on one
       
   155 # or all database backends.
       
   156 
       
   157 class BooleanPKData(models.Model):
       
   158     data = models.BooleanField(primary_key=True)
       
   159 
       
   160 class CharPKData(models.Model):
       
   161     data = models.CharField(max_length=30, primary_key=True)
       
   162 
       
   163 # class DatePKData(models.Model):
       
   164 #    data = models.DateField(primary_key=True)
       
   165 
       
   166 # class DateTimePKData(models.Model):
       
   167 #    data = models.DateTimeField(primary_key=True)
       
   168 
       
   169 class DecimalPKData(models.Model):
       
   170     data = models.DecimalField(primary_key=True, decimal_places=3, max_digits=5)
       
   171 
       
   172 class EmailPKData(models.Model):
       
   173     data = models.EmailField(primary_key=True)
       
   174 
       
   175 # class FilePKData(models.Model):
       
   176 #    data = models.FileField(primary_key=True, upload_to='/foo/bar')
       
   177 
       
   178 class FilePathPKData(models.Model):
       
   179     data = models.FilePathField(primary_key=True)
       
   180 
       
   181 class FloatPKData(models.Model):
       
   182     data = models.FloatField(primary_key=True)
       
   183 
       
   184 class IntegerPKData(models.Model):
       
   185     data = models.IntegerField(primary_key=True)
       
   186 
       
   187 # class ImagePKData(models.Model):
       
   188 #    data = models.ImageField(primary_key=True)
       
   189 
       
   190 class IPAddressPKData(models.Model):
       
   191     data = models.IPAddressField(primary_key=True)
       
   192 
       
   193 # This is just a Boolean field with null=True, and we can't test a PK value of NULL.
       
   194 # class NullBooleanPKData(models.Model):
       
   195 #     data = models.NullBooleanField(primary_key=True)
       
   196 
       
   197 class PhonePKData(models.Model):
       
   198     data = PhoneNumberField(primary_key=True)
       
   199 
       
   200 class PositiveIntegerPKData(models.Model):
       
   201     data = models.PositiveIntegerField(primary_key=True)
       
   202 
       
   203 class PositiveSmallIntegerPKData(models.Model):
       
   204     data = models.PositiveSmallIntegerField(primary_key=True)
       
   205 
       
   206 class SlugPKData(models.Model):
       
   207     data = models.SlugField(primary_key=True)
       
   208 
       
   209 class SmallPKData(models.Model):
       
   210     data = models.SmallIntegerField(primary_key=True)
       
   211 
       
   212 # class TextPKData(models.Model):
       
   213 #     data = models.TextField(primary_key=True)
       
   214 
       
   215 # class TimePKData(models.Model):
       
   216 #    data = models.TimeField(primary_key=True)
       
   217 
       
   218 class USStatePKData(models.Model):
       
   219     data = USStateField(primary_key=True)
       
   220 
       
   221 # class XMLPKData(models.Model):
       
   222 #     data = models.XMLField(primary_key=True)
       
   223 
       
   224 class ComplexModel(models.Model):
       
   225     field1 = models.CharField(max_length=10)
       
   226     field2 = models.CharField(max_length=10)
       
   227     field3 = models.CharField(max_length=10)
       
   228 
       
   229 # Tests for handling fields with pre_save functions, or
       
   230 # models with save functions that modify data
       
   231 class AutoNowDateTimeData(models.Model):
       
   232     data = models.DateTimeField(null=True, auto_now=True)
       
   233 
       
   234 class ModifyingSaveData(models.Model):
       
   235     data = models.IntegerField(null=True)
       
   236 
       
   237     def save(self):
       
   238         "A save method that modifies the data in the object"
       
   239         self.data = 666
       
   240         super(ModifyingSaveData, self).save(raw)
       
   241 
       
   242 # Tests for serialization of models using inheritance.
       
   243 # Regression for #7202, #7350
       
   244 class AbstractBaseModel(models.Model):
       
   245     parent_data = models.IntegerField()
       
   246     class Meta:
       
   247         abstract = True
       
   248 
       
   249 class InheritAbstractModel(AbstractBaseModel):
       
   250     child_data = models.IntegerField()
       
   251 
       
   252 class BaseModel(models.Model):
       
   253     parent_data = models.IntegerField()
       
   254 
       
   255 class InheritBaseModel(BaseModel):
       
   256     child_data = models.IntegerField()
       
   257 
       
   258 class ExplicitInheritBaseModel(BaseModel):
       
   259     parent = models.OneToOneField(BaseModel)
       
   260     child_data = models.IntegerField()
       
   261 
       
   262 class LengthModel(models.Model):
       
   263     data = models.IntegerField()
       
   264 
       
   265     def __len__(self):
       
   266         return self.data