1. from django.db import models
    
  2. 
    
  3. 
    
  4. class Product(models.Model):
    
  5.     price = models.IntegerField(null=True)
    
  6.     discounted_price = models.IntegerField(null=True)
    
  7.     unit = models.CharField(max_length=15, null=True)
    
  8. 
    
  9.     class Meta:
    
  10.         required_db_features = {
    
  11.             "supports_table_check_constraints",
    
  12.         }
    
  13.         constraints = [
    
  14.             models.CheckConstraint(
    
  15.                 check=models.Q(price__gt=models.F("discounted_price")),
    
  16.                 name="price_gt_discounted_price",
    
  17.             ),
    
  18.             models.CheckConstraint(
    
  19.                 check=models.Q(price__gt=0),
    
  20.                 name="%(app_label)s_%(class)s_price_gt_0",
    
  21.             ),
    
  22.             models.CheckConstraint(
    
  23.                 check=models.Q(
    
  24.                     models.Q(unit__isnull=True) | models.Q(unit__in=["μg/mL", "ng/mL"])
    
  25.                 ),
    
  26.                 name="unicode_unit_list",
    
  27.             ),
    
  28.         ]
    
  29. 
    
  30. 
    
  31. class UniqueConstraintProduct(models.Model):
    
  32.     name = models.CharField(max_length=255)
    
  33.     color = models.CharField(max_length=32, null=True)
    
  34. 
    
  35.     class Meta:
    
  36.         constraints = [
    
  37.             models.UniqueConstraint(fields=["name", "color"], name="name_color_uniq"),
    
  38.         ]
    
  39. 
    
  40. 
    
  41. class ChildUniqueConstraintProduct(UniqueConstraintProduct):
    
  42.     pass
    
  43. 
    
  44. 
    
  45. class UniqueConstraintConditionProduct(models.Model):
    
  46.     name = models.CharField(max_length=255)
    
  47.     color = models.CharField(max_length=32, null=True)
    
  48. 
    
  49.     class Meta:
    
  50.         required_db_features = {"supports_partial_indexes"}
    
  51.         constraints = [
    
  52.             models.UniqueConstraint(
    
  53.                 fields=["name"],
    
  54.                 name="name_without_color_uniq",
    
  55.                 condition=models.Q(color__isnull=True),
    
  56.             ),
    
  57.         ]
    
  58. 
    
  59. 
    
  60. class UniqueConstraintDeferrable(models.Model):
    
  61.     name = models.CharField(max_length=255)
    
  62.     shelf = models.CharField(max_length=31)
    
  63. 
    
  64.     class Meta:
    
  65.         required_db_features = {
    
  66.             "supports_deferrable_unique_constraints",
    
  67.         }
    
  68.         constraints = [
    
  69.             models.UniqueConstraint(
    
  70.                 fields=["name"],
    
  71.                 name="name_init_deferred_uniq",
    
  72.                 deferrable=models.Deferrable.DEFERRED,
    
  73.             ),
    
  74.             models.UniqueConstraint(
    
  75.                 fields=["shelf"],
    
  76.                 name="sheld_init_immediate_uniq",
    
  77.                 deferrable=models.Deferrable.IMMEDIATE,
    
  78.             ),
    
  79.         ]
    
  80. 
    
  81. 
    
  82. class UniqueConstraintInclude(models.Model):
    
  83.     name = models.CharField(max_length=255)
    
  84.     color = models.CharField(max_length=32, null=True)
    
  85. 
    
  86.     class Meta:
    
  87.         required_db_features = {
    
  88.             "supports_table_check_constraints",
    
  89.             "supports_covering_indexes",
    
  90.         }
    
  91.         constraints = [
    
  92.             models.UniqueConstraint(
    
  93.                 fields=["name"],
    
  94.                 name="name_include_color_uniq",
    
  95.                 include=["color"],
    
  96.             ),
    
  97.         ]
    
  98. 
    
  99. 
    
  100. class AbstractModel(models.Model):
    
  101.     age = models.IntegerField()
    
  102. 
    
  103.     class Meta:
    
  104.         abstract = True
    
  105.         required_db_features = {
    
  106.             "supports_table_check_constraints",
    
  107.         }
    
  108.         constraints = [
    
  109.             models.CheckConstraint(
    
  110.                 check=models.Q(age__gte=18),
    
  111.                 name="%(app_label)s_%(class)s_adult",
    
  112.             ),
    
  113.         ]
    
  114. 
    
  115. 
    
  116. class ChildModel(AbstractModel):
    
  117.     pass