models.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. from django.db import models
  2. from django.db.models.functions import Coalesce, Lower
  3. class Product(models.Model):
  4. price = models.IntegerField(null=True)
  5. discounted_price = models.IntegerField(null=True)
  6. unit = models.CharField(max_length=15, null=True)
  7. class Meta:
  8. required_db_features = {
  9. "supports_table_check_constraints",
  10. }
  11. constraints = [
  12. models.CheckConstraint(
  13. condition=models.Q(price__gt=models.F("discounted_price")),
  14. name="price_gt_discounted_price",
  15. ),
  16. models.CheckConstraint(
  17. condition=models.Q(price__gt=0),
  18. name="%(app_label)s_%(class)s_price_gt_0",
  19. ),
  20. models.CheckConstraint(
  21. condition=models.Q(
  22. models.Q(unit__isnull=True) | models.Q(unit__in=["μg/mL", "ng/mL"])
  23. ),
  24. name="unicode_unit_list",
  25. ),
  26. ]
  27. class GeneratedFieldStoredProduct(models.Model):
  28. name = models.CharField(max_length=255, null=True)
  29. price = models.IntegerField(null=True)
  30. discounted_price = models.IntegerField(null=True)
  31. rebate = models.GeneratedField(
  32. expression=Coalesce("price", 0)
  33. - Coalesce("discounted_price", Coalesce("price", 0)),
  34. output_field=models.IntegerField(),
  35. db_persist=True,
  36. )
  37. lower_name = models.GeneratedField(
  38. expression=Lower(models.F("name")),
  39. output_field=models.CharField(max_length=255, null=True),
  40. db_persist=True,
  41. )
  42. class Meta:
  43. required_db_features = {"supports_stored_generated_columns"}
  44. class GeneratedFieldVirtualProduct(models.Model):
  45. name = models.CharField(max_length=255, null=True)
  46. price = models.IntegerField(null=True)
  47. discounted_price = models.IntegerField(null=True)
  48. rebate = models.GeneratedField(
  49. expression=Coalesce("price", 0)
  50. - Coalesce("discounted_price", Coalesce("price", 0)),
  51. output_field=models.IntegerField(),
  52. db_persist=False,
  53. )
  54. lower_name = models.GeneratedField(
  55. expression=Lower(models.F("name")),
  56. output_field=models.CharField(max_length=255, null=True),
  57. db_persist=False,
  58. )
  59. class Meta:
  60. required_db_features = {"supports_virtual_generated_columns"}
  61. class UniqueConstraintProduct(models.Model):
  62. name = models.CharField(max_length=255)
  63. color = models.CharField(max_length=32, null=True)
  64. age = models.IntegerField(null=True)
  65. class Meta:
  66. constraints = [
  67. models.UniqueConstraint(
  68. fields=["name", "color"],
  69. name="name_color_uniq",
  70. )
  71. ]
  72. class ChildUniqueConstraintProduct(UniqueConstraintProduct):
  73. pass
  74. class UniqueConstraintConditionProduct(models.Model):
  75. name = models.CharField(max_length=255)
  76. color = models.CharField(max_length=32, null=True)
  77. class Meta:
  78. required_db_features = {"supports_partial_indexes"}
  79. constraints = [
  80. models.UniqueConstraint(
  81. fields=["name"],
  82. name="name_without_color_uniq",
  83. condition=models.Q(color__isnull=True),
  84. ),
  85. ]
  86. class UniqueConstraintDeferrable(models.Model):
  87. name = models.CharField(max_length=255)
  88. shelf = models.CharField(max_length=31)
  89. class Meta:
  90. required_db_features = {
  91. "supports_deferrable_unique_constraints",
  92. }
  93. constraints = [
  94. models.UniqueConstraint(
  95. fields=["name"],
  96. name="name_init_deferred_uniq",
  97. deferrable=models.Deferrable.DEFERRED,
  98. ),
  99. models.UniqueConstraint(
  100. fields=["shelf"],
  101. name="sheld_init_immediate_uniq",
  102. deferrable=models.Deferrable.IMMEDIATE,
  103. ),
  104. ]
  105. class UniqueConstraintInclude(models.Model):
  106. name = models.CharField(max_length=255)
  107. color = models.CharField(max_length=32, null=True)
  108. class Meta:
  109. required_db_features = {
  110. "supports_table_check_constraints",
  111. "supports_covering_indexes",
  112. }
  113. constraints = [
  114. models.UniqueConstraint(
  115. fields=["name"],
  116. name="name_include_color_uniq",
  117. include=["color"],
  118. ),
  119. ]
  120. class AbstractModel(models.Model):
  121. age = models.IntegerField()
  122. class Meta:
  123. abstract = True
  124. required_db_features = {
  125. "supports_table_check_constraints",
  126. }
  127. constraints = [
  128. models.CheckConstraint(
  129. condition=models.Q(age__gte=18),
  130. name="%(app_label)s_%(class)s_adult",
  131. ),
  132. ]
  133. class ChildModel(AbstractModel):
  134. pass
  135. class JSONFieldModel(models.Model):
  136. data = models.JSONField(null=True)
  137. class Meta:
  138. required_db_features = {"supports_json_field"}
  139. class ModelWithDatabaseDefault(models.Model):
  140. field = models.CharField(max_length=255)
  141. field_with_db_default = models.CharField(
  142. max_length=255, db_default=models.Value("field_with_db_default")
  143. )