1. """
    
  2. Serialization
    
  3. 
    
  4. ``django.core.serializers`` provides interfaces to converting Django
    
  5. ``QuerySet`` objects to and from "flat" data (i.e. strings).
    
  6. """
    
  7. from decimal import Decimal
    
  8. 
    
  9. from django.db import models
    
  10. 
    
  11. 
    
  12. class CategoryMetaDataManager(models.Manager):
    
  13.     def get_by_natural_key(self, kind, name):
    
  14.         return self.get(kind=kind, name=name)
    
  15. 
    
  16. 
    
  17. class CategoryMetaData(models.Model):
    
  18.     kind = models.CharField(max_length=10)
    
  19.     name = models.CharField(max_length=10)
    
  20.     value = models.CharField(max_length=10)
    
  21.     objects = CategoryMetaDataManager()
    
  22. 
    
  23.     class Meta:
    
  24.         unique_together = (("kind", "name"),)
    
  25. 
    
  26.     def __str__(self):
    
  27.         return "[%s:%s]=%s" % (self.kind, self.name, self.value)
    
  28. 
    
  29.     def natural_key(self):
    
  30.         return (self.kind, self.name)
    
  31. 
    
  32. 
    
  33. class Category(models.Model):
    
  34.     name = models.CharField(max_length=20)
    
  35.     meta_data = models.ForeignKey(
    
  36.         CategoryMetaData, models.SET_NULL, null=True, default=None
    
  37.     )
    
  38. 
    
  39.     class Meta:
    
  40.         ordering = ("name",)
    
  41. 
    
  42.     def __str__(self):
    
  43.         return self.name
    
  44. 
    
  45. 
    
  46. class Author(models.Model):
    
  47.     name = models.CharField(max_length=20)
    
  48. 
    
  49.     class Meta:
    
  50.         ordering = ("name",)
    
  51. 
    
  52.     def __str__(self):
    
  53.         return self.name
    
  54. 
    
  55. 
    
  56. class Article(models.Model):
    
  57.     author = models.ForeignKey(Author, models.CASCADE)
    
  58.     headline = models.CharField(max_length=50)
    
  59.     pub_date = models.DateTimeField()
    
  60.     categories = models.ManyToManyField(Category)
    
  61.     meta_data = models.ManyToManyField(CategoryMetaData)
    
  62. 
    
  63.     class Meta:
    
  64.         ordering = ("pub_date",)
    
  65. 
    
  66.     def __str__(self):
    
  67.         return self.headline
    
  68. 
    
  69. 
    
  70. class AuthorProfile(models.Model):
    
  71.     author = models.OneToOneField(Author, models.CASCADE, primary_key=True)
    
  72.     date_of_birth = models.DateField()
    
  73. 
    
  74.     def __str__(self):
    
  75.         return "Profile of %s" % self.author
    
  76. 
    
  77. 
    
  78. class Actor(models.Model):
    
  79.     name = models.CharField(max_length=20, primary_key=True)
    
  80. 
    
  81.     class Meta:
    
  82.         ordering = ("name",)
    
  83. 
    
  84.     def __str__(self):
    
  85.         return self.name
    
  86. 
    
  87. 
    
  88. class Movie(models.Model):
    
  89.     actor = models.ForeignKey(Actor, models.CASCADE)
    
  90.     title = models.CharField(max_length=50)
    
  91.     price = models.DecimalField(max_digits=6, decimal_places=2, default=Decimal("0.00"))
    
  92. 
    
  93.     class Meta:
    
  94.         ordering = ("title",)
    
  95. 
    
  96.     def __str__(self):
    
  97.         return self.title
    
  98. 
    
  99. 
    
  100. class Score(models.Model):
    
  101.     score = models.FloatField()
    
  102. 
    
  103. 
    
  104. class Team:
    
  105.     def __init__(self, title):
    
  106.         self.title = title
    
  107. 
    
  108.     def __str__(self):
    
  109.         raise NotImplementedError("Not so simple")
    
  110. 
    
  111.     def to_string(self):
    
  112.         return str(self.title)
    
  113. 
    
  114. 
    
  115. class TeamField(models.CharField):
    
  116.     def __init__(self):
    
  117.         super().__init__(max_length=100)
    
  118. 
    
  119.     def get_db_prep_save(self, value, connection):
    
  120.         return str(value.title)
    
  121. 
    
  122.     def to_python(self, value):
    
  123.         if isinstance(value, Team):
    
  124.             return value
    
  125.         return Team(value)
    
  126. 
    
  127.     def from_db_value(self, value, expression, connection):
    
  128.         return Team(value)
    
  129. 
    
  130.     def value_to_string(self, obj):
    
  131.         return self.value_from_object(obj).to_string()
    
  132. 
    
  133.     def deconstruct(self):
    
  134.         name, path, args, kwargs = super().deconstruct()
    
  135.         del kwargs["max_length"]
    
  136.         return name, path, args, kwargs
    
  137. 
    
  138. 
    
  139. class Player(models.Model):
    
  140.     name = models.CharField(max_length=50)
    
  141.     rank = models.IntegerField()
    
  142.     team = TeamField()
    
  143. 
    
  144.     def __str__(self):
    
  145.         return "%s (%d) playing for %s" % (self.name, self.rank, self.team.to_string())
    
  146. 
    
  147. 
    
  148. class BaseModel(models.Model):
    
  149.     parent_data = models.IntegerField()
    
  150. 
    
  151. 
    
  152. class ProxyBaseModel(BaseModel):
    
  153.     class Meta:
    
  154.         proxy = True
    
  155. 
    
  156. 
    
  157. class ProxyProxyBaseModel(ProxyBaseModel):
    
  158.     class Meta:
    
  159.         proxy = True
    
  160. 
    
  161. 
    
  162. class ComplexModel(models.Model):
    
  163.     field1 = models.CharField(max_length=10)
    
  164.     field2 = models.CharField(max_length=10)
    
  165.     field3 = models.CharField(max_length=10)