2
0

models.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. from django.db import models
  2. from .fields import (
  3. ArrayField, BigIntegerRangeField, CICharField, CIEmailField, CITextField,
  4. DateRangeField, DateTimeRangeField, DecimalRangeField, EnumField,
  5. HStoreField, IntegerRangeField, SearchVectorField,
  6. )
  7. class Tag:
  8. def __init__(self, tag_id):
  9. self.tag_id = tag_id
  10. def __eq__(self, other):
  11. return isinstance(other, Tag) and self.tag_id == other.tag_id
  12. class TagField(models.SmallIntegerField):
  13. def from_db_value(self, value, expression, connection):
  14. if value is None:
  15. return value
  16. return Tag(int(value))
  17. def to_python(self, value):
  18. if isinstance(value, Tag):
  19. return value
  20. if value is None:
  21. return value
  22. return Tag(int(value))
  23. def get_prep_value(self, value):
  24. return value.tag_id
  25. class PostgreSQLModel(models.Model):
  26. class Meta:
  27. abstract = True
  28. required_db_vendor = 'postgresql'
  29. class IntegerArrayModel(PostgreSQLModel):
  30. field = ArrayField(models.IntegerField(), default=list, blank=True)
  31. class NullableIntegerArrayModel(PostgreSQLModel):
  32. field = ArrayField(models.IntegerField(), blank=True, null=True)
  33. field_nested = ArrayField(ArrayField(models.IntegerField(null=True)), null=True)
  34. order = models.IntegerField(null=True)
  35. class CharArrayModel(PostgreSQLModel):
  36. field = ArrayField(models.CharField(max_length=10))
  37. class DateTimeArrayModel(PostgreSQLModel):
  38. datetimes = ArrayField(models.DateTimeField())
  39. dates = ArrayField(models.DateField())
  40. times = ArrayField(models.TimeField())
  41. class NestedIntegerArrayModel(PostgreSQLModel):
  42. field = ArrayField(ArrayField(models.IntegerField()))
  43. class OtherTypesArrayModel(PostgreSQLModel):
  44. ips = ArrayField(models.GenericIPAddressField(), default=list)
  45. uuids = ArrayField(models.UUIDField(), default=list)
  46. decimals = ArrayField(models.DecimalField(max_digits=5, decimal_places=2), default=list)
  47. tags = ArrayField(TagField(), blank=True, null=True)
  48. json = ArrayField(models.JSONField(default=dict), default=list)
  49. int_ranges = ArrayField(IntegerRangeField(), blank=True, null=True)
  50. bigint_ranges = ArrayField(BigIntegerRangeField(), blank=True, null=True)
  51. class HStoreModel(PostgreSQLModel):
  52. field = HStoreField(blank=True, null=True)
  53. array_field = ArrayField(HStoreField(), null=True)
  54. class ArrayEnumModel(PostgreSQLModel):
  55. array_of_enums = ArrayField(EnumField(max_length=20))
  56. class CharFieldModel(models.Model):
  57. field = models.CharField(max_length=64)
  58. class TextFieldModel(models.Model):
  59. field = models.TextField()
  60. class SmallAutoFieldModel(models.Model):
  61. id = models.SmallAutoField(primary_key=True)
  62. class BigAutoFieldModel(models.Model):
  63. id = models.BigAutoField(primary_key=True)
  64. # Scene/Character/Line models are used to test full text search. They're
  65. # populated with content from Monty Python and the Holy Grail.
  66. class Scene(models.Model):
  67. scene = models.TextField()
  68. setting = models.CharField(max_length=255)
  69. class Character(models.Model):
  70. name = models.CharField(max_length=255)
  71. class CITestModel(PostgreSQLModel):
  72. name = CICharField(primary_key=True, max_length=255)
  73. email = CIEmailField()
  74. description = CITextField()
  75. array_field = ArrayField(CITextField(), null=True)
  76. class Line(PostgreSQLModel):
  77. scene = models.ForeignKey('Scene', models.CASCADE)
  78. character = models.ForeignKey('Character', models.CASCADE)
  79. dialogue = models.TextField(blank=True, null=True)
  80. dialogue_search_vector = SearchVectorField(blank=True, null=True)
  81. dialogue_config = models.CharField(max_length=100, blank=True, null=True)
  82. class LineSavedSearch(PostgreSQLModel):
  83. line = models.ForeignKey('Line', models.CASCADE)
  84. query = models.CharField(max_length=100)
  85. class RangesModel(PostgreSQLModel):
  86. ints = IntegerRangeField(blank=True, null=True)
  87. bigints = BigIntegerRangeField(blank=True, null=True)
  88. decimals = DecimalRangeField(blank=True, null=True)
  89. timestamps = DateTimeRangeField(blank=True, null=True)
  90. timestamps_inner = DateTimeRangeField(blank=True, null=True)
  91. dates = DateRangeField(blank=True, null=True)
  92. dates_inner = DateRangeField(blank=True, null=True)
  93. class RangeLookupsModel(PostgreSQLModel):
  94. parent = models.ForeignKey(RangesModel, models.SET_NULL, blank=True, null=True)
  95. integer = models.IntegerField(blank=True, null=True)
  96. big_integer = models.BigIntegerField(blank=True, null=True)
  97. float = models.FloatField(blank=True, null=True)
  98. timestamp = models.DateTimeField(blank=True, null=True)
  99. date = models.DateField(blank=True, null=True)
  100. small_integer = models.SmallIntegerField(blank=True, null=True)
  101. decimal_field = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
  102. class ArrayFieldSubclass(ArrayField):
  103. def __init__(self, *args, **kwargs):
  104. super().__init__(models.IntegerField())
  105. class AggregateTestModel(PostgreSQLModel):
  106. """
  107. To test postgres-specific general aggregation functions
  108. """
  109. char_field = models.CharField(max_length=30, blank=True)
  110. text_field = models.TextField(blank=True)
  111. integer_field = models.IntegerField(null=True)
  112. boolean_field = models.BooleanField(null=True)
  113. json_field = models.JSONField(null=True)
  114. class StatTestModel(PostgreSQLModel):
  115. """
  116. To test postgres-specific aggregation functions for statistics
  117. """
  118. int1 = models.IntegerField()
  119. int2 = models.IntegerField()
  120. related_field = models.ForeignKey(AggregateTestModel, models.SET_NULL, null=True)
  121. class NowTestModel(models.Model):
  122. when = models.DateTimeField(null=True, default=None)
  123. class UUIDTestModel(models.Model):
  124. uuid = models.UUIDField(default=None, null=True)
  125. class Room(models.Model):
  126. number = models.IntegerField(unique=True)
  127. class HotelReservation(PostgreSQLModel):
  128. room = models.ForeignKey('Room', on_delete=models.CASCADE)
  129. datespan = DateRangeField()
  130. start = models.DateTimeField()
  131. end = models.DateTimeField()
  132. cancelled = models.BooleanField(default=False)
  133. requirements = models.JSONField(blank=True, null=True)