2
0

models.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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. class CharArrayModel(PostgreSQLModel):
  35. field = ArrayField(models.CharField(max_length=10))
  36. class DateTimeArrayModel(PostgreSQLModel):
  37. datetimes = ArrayField(models.DateTimeField())
  38. dates = ArrayField(models.DateField())
  39. times = ArrayField(models.TimeField())
  40. class NestedIntegerArrayModel(PostgreSQLModel):
  41. field = ArrayField(ArrayField(models.IntegerField()))
  42. class OtherTypesArrayModel(PostgreSQLModel):
  43. ips = ArrayField(models.GenericIPAddressField(), default=list)
  44. uuids = ArrayField(models.UUIDField(), default=list)
  45. decimals = ArrayField(models.DecimalField(max_digits=5, decimal_places=2), default=list)
  46. tags = ArrayField(TagField(), blank=True, null=True)
  47. json = ArrayField(models.JSONField(default=dict), default=list)
  48. int_ranges = ArrayField(IntegerRangeField(), blank=True, null=True)
  49. bigint_ranges = ArrayField(BigIntegerRangeField(), blank=True, null=True)
  50. class HStoreModel(PostgreSQLModel):
  51. field = HStoreField(blank=True, null=True)
  52. array_field = ArrayField(HStoreField(), null=True)
  53. class ArrayEnumModel(PostgreSQLModel):
  54. array_of_enums = ArrayField(EnumField(max_length=20))
  55. class CharFieldModel(models.Model):
  56. field = models.CharField(max_length=16)
  57. class TextFieldModel(models.Model):
  58. field = models.TextField()
  59. class SmallAutoFieldModel(models.Model):
  60. id = models.SmallAutoField(primary_key=True)
  61. class BigAutoFieldModel(models.Model):
  62. id = models.BigAutoField(primary_key=True)
  63. # Scene/Character/Line models are used to test full text search. They're
  64. # populated with content from Monty Python and the Holy Grail.
  65. class Scene(models.Model):
  66. scene = models.CharField(max_length=255)
  67. setting = models.CharField(max_length=255)
  68. class Character(models.Model):
  69. name = models.CharField(max_length=255)
  70. class CITestModel(PostgreSQLModel):
  71. name = CICharField(primary_key=True, max_length=255)
  72. email = CIEmailField()
  73. description = CITextField()
  74. array_field = ArrayField(CITextField(), null=True)
  75. class Line(PostgreSQLModel):
  76. scene = models.ForeignKey('Scene', models.CASCADE)
  77. character = models.ForeignKey('Character', models.CASCADE)
  78. dialogue = models.TextField(blank=True, null=True)
  79. dialogue_search_vector = SearchVectorField(blank=True, null=True)
  80. dialogue_config = models.CharField(max_length=100, blank=True, null=True)
  81. class LineSavedSearch(PostgreSQLModel):
  82. line = models.ForeignKey('Line', models.CASCADE)
  83. query = models.CharField(max_length=100)
  84. class RangesModel(PostgreSQLModel):
  85. ints = IntegerRangeField(blank=True, null=True)
  86. bigints = BigIntegerRangeField(blank=True, null=True)
  87. decimals = DecimalRangeField(blank=True, null=True)
  88. timestamps = DateTimeRangeField(blank=True, null=True)
  89. timestamps_inner = DateTimeRangeField(blank=True, null=True)
  90. dates = DateRangeField(blank=True, null=True)
  91. dates_inner = DateRangeField(blank=True, null=True)
  92. class RangeLookupsModel(PostgreSQLModel):
  93. parent = models.ForeignKey(RangesModel, models.SET_NULL, blank=True, null=True)
  94. integer = models.IntegerField(blank=True, null=True)
  95. big_integer = models.BigIntegerField(blank=True, null=True)
  96. float = models.FloatField(blank=True, null=True)
  97. timestamp = models.DateTimeField(blank=True, null=True)
  98. date = models.DateField(blank=True, null=True)
  99. small_integer = models.SmallIntegerField(blank=True, null=True)
  100. decimal_field = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
  101. class ArrayFieldSubclass(ArrayField):
  102. def __init__(self, *args, **kwargs):
  103. super().__init__(models.IntegerField())
  104. class AggregateTestModel(models.Model):
  105. """
  106. To test postgres-specific general aggregation functions
  107. """
  108. char_field = models.CharField(max_length=30, blank=True)
  109. integer_field = models.IntegerField(null=True)
  110. boolean_field = models.BooleanField(null=True)
  111. class StatTestModel(models.Model):
  112. """
  113. To test postgres-specific aggregation functions for statistics
  114. """
  115. int1 = models.IntegerField()
  116. int2 = models.IntegerField()
  117. related_field = models.ForeignKey(AggregateTestModel, models.SET_NULL, null=True)
  118. class NowTestModel(models.Model):
  119. when = models.DateTimeField(null=True, default=None)
  120. class UUIDTestModel(models.Model):
  121. uuid = models.UUIDField(default=None, null=True)
  122. class Room(models.Model):
  123. number = models.IntegerField(unique=True)
  124. class HotelReservation(PostgreSQLModel):
  125. room = models.ForeignKey('Room', on_delete=models.CASCADE)
  126. datespan = DateRangeField()
  127. start = models.DateTimeField()
  128. end = models.DateTimeField()
  129. cancelled = models.BooleanField(default=False)