base.py 3.8 KB

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