1. import datetime
    
  2. import uuid
    
  3. from decimal import Decimal
    
  4. 
    
  5. from django.db import models
    
  6. from django.utils import timezone
    
  7. 
    
  8. try:
    
  9.     from PIL import Image
    
  10. except ImportError:
    
  11.     Image = None
    
  12. 
    
  13. 
    
  14. class Country(models.Model):
    
  15.     name = models.CharField(max_length=255)
    
  16.     iso_two_letter = models.CharField(max_length=2)
    
  17.     description = models.TextField()
    
  18. 
    
  19.     class Meta:
    
  20.         constraints = [
    
  21.             models.UniqueConstraint(
    
  22.                 fields=["iso_two_letter", "name"],
    
  23.                 name="country_name_iso_unique",
    
  24.             ),
    
  25.         ]
    
  26. 
    
  27. 
    
  28. class ProxyCountry(Country):
    
  29.     class Meta:
    
  30.         proxy = True
    
  31. 
    
  32. 
    
  33. class ProxyProxyCountry(ProxyCountry):
    
  34.     class Meta:
    
  35.         proxy = True
    
  36. 
    
  37. 
    
  38. class ProxyMultiCountry(ProxyCountry):
    
  39.     pass
    
  40. 
    
  41. 
    
  42. class ProxyMultiProxyCountry(ProxyMultiCountry):
    
  43.     class Meta:
    
  44.         proxy = True
    
  45. 
    
  46. 
    
  47. class Place(models.Model):
    
  48.     name = models.CharField(max_length=100)
    
  49. 
    
  50.     class Meta:
    
  51.         abstract = True
    
  52. 
    
  53. 
    
  54. class Restaurant(Place):
    
  55.     pass
    
  56. 
    
  57. 
    
  58. class Pizzeria(Restaurant):
    
  59.     pass
    
  60. 
    
  61. 
    
  62. class State(models.Model):
    
  63.     two_letter_code = models.CharField(max_length=2, primary_key=True)
    
  64. 
    
  65. 
    
  66. class TwoFields(models.Model):
    
  67.     f1 = models.IntegerField(unique=True)
    
  68.     f2 = models.IntegerField(unique=True)
    
  69.     name = models.CharField(max_length=15, null=True)
    
  70. 
    
  71. 
    
  72. class FieldsWithDbColumns(models.Model):
    
  73.     rank = models.IntegerField(unique=True, db_column="rAnK")
    
  74.     name = models.CharField(max_length=15, null=True, db_column="oTheRNaMe")
    
  75. 
    
  76. 
    
  77. class UpsertConflict(models.Model):
    
  78.     number = models.IntegerField(unique=True)
    
  79.     rank = models.IntegerField()
    
  80.     name = models.CharField(max_length=15)
    
  81. 
    
  82. 
    
  83. class NoFields(models.Model):
    
  84.     pass
    
  85. 
    
  86. 
    
  87. class SmallAutoFieldModel(models.Model):
    
  88.     id = models.SmallAutoField(primary_key=True)
    
  89. 
    
  90. 
    
  91. class BigAutoFieldModel(models.Model):
    
  92.     id = models.BigAutoField(primary_key=True)
    
  93. 
    
  94. 
    
  95. class NullableFields(models.Model):
    
  96.     # Fields in db.backends.oracle.BulkInsertMapper
    
  97.     big_int_filed = models.BigIntegerField(null=True, default=1)
    
  98.     binary_field = models.BinaryField(null=True, default=b"data")
    
  99.     date_field = models.DateField(null=True, default=timezone.now)
    
  100.     datetime_field = models.DateTimeField(null=True, default=timezone.now)
    
  101.     decimal_field = models.DecimalField(
    
  102.         null=True, max_digits=2, decimal_places=1, default=Decimal("1.1")
    
  103.     )
    
  104.     duration_field = models.DurationField(null=True, default=datetime.timedelta(1))
    
  105.     float_field = models.FloatField(null=True, default=3.2)
    
  106.     integer_field = models.IntegerField(null=True, default=2)
    
  107.     null_boolean_field = models.BooleanField(null=True, default=False)
    
  108.     positive_big_integer_field = models.PositiveBigIntegerField(
    
  109.         null=True, default=2**63 - 1
    
  110.     )
    
  111.     positive_integer_field = models.PositiveIntegerField(null=True, default=3)
    
  112.     positive_small_integer_field = models.PositiveSmallIntegerField(
    
  113.         null=True, default=4
    
  114.     )
    
  115.     small_integer_field = models.SmallIntegerField(null=True, default=5)
    
  116.     time_field = models.TimeField(null=True, default=timezone.now)
    
  117.     auto_field = models.ForeignKey(NoFields, on_delete=models.CASCADE, null=True)
    
  118.     small_auto_field = models.ForeignKey(
    
  119.         SmallAutoFieldModel, on_delete=models.CASCADE, null=True
    
  120.     )
    
  121.     big_auto_field = models.ForeignKey(
    
  122.         BigAutoFieldModel, on_delete=models.CASCADE, null=True
    
  123.     )
    
  124.     # Fields not required in BulkInsertMapper
    
  125.     char_field = models.CharField(null=True, max_length=4, default="char")
    
  126.     email_field = models.EmailField(null=True, default="[email protected]")
    
  127.     file_field = models.FileField(null=True, default="file.txt")
    
  128.     file_path_field = models.FilePathField(path="/tmp", null=True, default="file.txt")
    
  129.     generic_ip_address_field = models.GenericIPAddressField(
    
  130.         null=True, default="127.0.0.1"
    
  131.     )
    
  132.     if Image:
    
  133.         image_field = models.ImageField(null=True, default="image.jpg")
    
  134.     slug_field = models.SlugField(null=True, default="slug")
    
  135.     text_field = models.TextField(null=True, default="text")
    
  136.     url_field = models.URLField(null=True, default="/")
    
  137.     uuid_field = models.UUIDField(null=True, default=uuid.uuid4)
    
  138. 
    
  139. 
    
  140. class RelatedModel(models.Model):
    
  141.     name = models.CharField(max_length=15, null=True)
    
  142.     country = models.OneToOneField(Country, models.CASCADE, primary_key=True)
    
  143.     big_auto_fields = models.ManyToManyField(BigAutoFieldModel)