1. from django.db import connection, models
    
  2. from django.db.models.functions import Lower
    
  3. 
    
  4. 
    
  5. class People(models.Model):
    
  6.     name = models.CharField(max_length=255)
    
  7.     parent = models.ForeignKey("self", models.CASCADE)
    
  8. 
    
  9. 
    
  10. class Message(models.Model):
    
  11.     from_field = models.ForeignKey(People, models.CASCADE, db_column="from_id")
    
  12. 
    
  13. 
    
  14. class PeopleData(models.Model):
    
  15.     people_pk = models.ForeignKey(People, models.CASCADE, primary_key=True)
    
  16.     ssn = models.CharField(max_length=11)
    
  17. 
    
  18. 
    
  19. class PeopleMoreData(models.Model):
    
  20.     people_unique = models.ForeignKey(People, models.CASCADE, unique=True)
    
  21.     message = models.ForeignKey(Message, models.CASCADE, blank=True, null=True)
    
  22.     license = models.CharField(max_length=255)
    
  23. 
    
  24. 
    
  25. class ForeignKeyToField(models.Model):
    
  26.     to_field_fk = models.ForeignKey(
    
  27.         PeopleMoreData,
    
  28.         models.CASCADE,
    
  29.         to_field="people_unique",
    
  30.     )
    
  31. 
    
  32. 
    
  33. class DigitsInColumnName(models.Model):
    
  34.     all_digits = models.CharField(max_length=11, db_column="123")
    
  35.     leading_digit = models.CharField(max_length=11, db_column="4extra")
    
  36.     leading_digits = models.CharField(max_length=11, db_column="45extra")
    
  37. 
    
  38. 
    
  39. class SpecialName(models.Model):
    
  40.     field = models.IntegerField(db_column="field")
    
  41.     # Underscores
    
  42.     field_field_0 = models.IntegerField(db_column="Field_")
    
  43.     field_field_1 = models.IntegerField(db_column="Field__")
    
  44.     field_field_2 = models.IntegerField(db_column="__field")
    
  45.     # Other chars
    
  46.     prc_x = models.IntegerField(db_column="prc(%) x")
    
  47.     non_ascii = models.IntegerField(db_column="tamaƱo")
    
  48. 
    
  49.     class Meta:
    
  50.         db_table = "inspectdb_special.table name"
    
  51. 
    
  52. 
    
  53. class ColumnTypes(models.Model):
    
  54.     id = models.AutoField(primary_key=True)
    
  55.     big_int_field = models.BigIntegerField()
    
  56.     bool_field = models.BooleanField(default=False)
    
  57.     null_bool_field = models.BooleanField(null=True)
    
  58.     char_field = models.CharField(max_length=10)
    
  59.     null_char_field = models.CharField(max_length=10, blank=True, null=True)
    
  60.     date_field = models.DateField()
    
  61.     date_time_field = models.DateTimeField()
    
  62.     decimal_field = models.DecimalField(max_digits=6, decimal_places=1)
    
  63.     email_field = models.EmailField()
    
  64.     file_field = models.FileField(upload_to="unused")
    
  65.     file_path_field = models.FilePathField()
    
  66.     float_field = models.FloatField()
    
  67.     int_field = models.IntegerField()
    
  68.     gen_ip_address_field = models.GenericIPAddressField(protocol="ipv4")
    
  69.     pos_big_int_field = models.PositiveBigIntegerField()
    
  70.     pos_int_field = models.PositiveIntegerField()
    
  71.     pos_small_int_field = models.PositiveSmallIntegerField()
    
  72.     slug_field = models.SlugField()
    
  73.     small_int_field = models.SmallIntegerField()
    
  74.     text_field = models.TextField()
    
  75.     time_field = models.TimeField()
    
  76.     url_field = models.URLField()
    
  77.     uuid_field = models.UUIDField()
    
  78. 
    
  79. 
    
  80. class JSONFieldColumnType(models.Model):
    
  81.     json_field = models.JSONField()
    
  82.     null_json_field = models.JSONField(blank=True, null=True)
    
  83. 
    
  84.     class Meta:
    
  85.         required_db_features = {
    
  86.             "can_introspect_json_field",
    
  87.             "supports_json_field",
    
  88.         }
    
  89. 
    
  90. 
    
  91. test_collation = connection.features.test_collations.get("non_default")
    
  92. 
    
  93. 
    
  94. class CharFieldDbCollation(models.Model):
    
  95.     char_field = models.CharField(max_length=10, db_collation=test_collation)
    
  96. 
    
  97.     class Meta:
    
  98.         required_db_features = {"supports_collation_on_charfield"}
    
  99. 
    
  100. 
    
  101. class TextFieldDbCollation(models.Model):
    
  102.     text_field = models.TextField(db_collation=test_collation)
    
  103. 
    
  104.     class Meta:
    
  105.         required_db_features = {"supports_collation_on_textfield"}
    
  106. 
    
  107. 
    
  108. class UniqueTogether(models.Model):
    
  109.     field1 = models.IntegerField()
    
  110.     field2 = models.CharField(max_length=10)
    
  111.     from_field = models.IntegerField(db_column="from")
    
  112.     non_unique = models.IntegerField(db_column="non__unique_column")
    
  113.     non_unique_0 = models.IntegerField(db_column="non_unique__column")
    
  114. 
    
  115.     class Meta:
    
  116.         unique_together = [
    
  117.             ("field1", "field2"),
    
  118.             ("from_field", "field1"),
    
  119.             ("non_unique", "non_unique_0"),
    
  120.         ]
    
  121. 
    
  122. 
    
  123. class FuncUniqueConstraint(models.Model):
    
  124.     name = models.CharField(max_length=255)
    
  125.     rank = models.IntegerField()
    
  126. 
    
  127.     class Meta:
    
  128.         constraints = [
    
  129.             models.UniqueConstraint(
    
  130.                 Lower("name"), models.F("rank"), name="index_lower_name"
    
  131.             )
    
  132.         ]
    
  133.         required_db_features = {"supports_expression_indexes"}