base.py 4.2 KB

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