Поле SmallAutoField

Поле SmallAutoField является разновидностью автоматического поля в Django, которое хранит целые числа в диапазоне от 1 до 32767. Это поле автоматически генерирует следующее целое число при создании новой записи. В отличие от AutoField, которое использует INTEGER, и BigAutoField, использующее BIGINT, SmallAutoField занимает меньше места в базе данных и подходит для проектов с ограниченным количеством записей.

Синтаксис

pythonfrom django.db import models

class MyModel(models.Model):
  id = models.SmallAutoField(primary_key=True)
  # другие поля

Поле принимает следующие параметры:

Параметры

Основные параметры поля SmallAutoField:

Поле SmallAutoField автоматически создает последовательность в базе данных для генерации уникальных значений.

Пример . Простая модель

Рассмотрим использование SmallAutoField в модели для категорий товаров:

pythonfrom django.db import models

class Category(models.Model):
  id = models.SmallAutoField(primary_key=True)
  name = models.CharField(max_length=50)
  description = models.TextField(blank=True)

  def __str__(self):
    return self.name

При создании новой категории значение поля id будет присвоено автоматически:

pythonfrom myapp.models import Category

category = Category.objects.create(name="Electronics")
print(category.id)

Результат выполнения кода:

python"1"

Пример . С явным указанием первичного ключа

По умолчанию Django автоматически добавляет поле AutoField для первичного ключа. Вы можете заменить его на SmallAutoField, указав параметр primary_key=True:

pythonfrom django.db import models

class Tag(models.Model):
  id = models.SmallAutoField(primary_key=True)
  name = models.CharField(max_length=30)
  created_at = models.DateTimeField(auto_now_add=True)

Теперь при создании тега поле id будет получать автоматически увеличиваемое значение в пределах допустимого диапазона:

pythonfrom myapp.models import Tag

tag1 = Tag.objects.create(name="Python")
tag2 = Tag.objects.create(name="Django")

print(f"Tag 1 ID: {tag1.id}")
print(f"Tag 2 ID: {tag2.id}")

Результат выполнения кода:

python"Tag 1 ID: 1"
"Tag 2 ID: 2"

Пример . Использование с ForeignKey

Поле SmallAutoField может использоваться как внешний ключ для связи с другой моделью. Рассмотрим пример с товарами и заказами:

pythonfrom django.db import models

class Product(models.Model):
  id = models.SmallAutoField(primary_key=True)
  name = models.CharField(max_length=100)
  price = models.DecimalField(max_digits=10, decimal_places=2)

class Order(models.Model):
  product = models.ForeignKey(Product, on_delete=models.CASCADE)
  quantity = models.PositiveSmallIntegerField()

Теперь создадим продукт и заказ с ним:

pythonfrom myapp.models import Product, Order

product = Product.objects.create(name="Laptop", price=999.99)
order = Order.objects.create(product=product, quantity=2)

print(f"Product ID: {product.id}")
print(f"Order product ID: {order.product.id}")

Результат выполнения кода:

python"Product ID: 1"
"Order product ID: 1"

Пример . Проверка автоматической генерации

Создадим несколько записей подряд, чтобы увидеть автоматическое увеличение значения:

pythonfrom myapp.models import Tag

tags = ["Web", "Mobile", "AI", "Data"]

for tag_name in tags:
  tag = Tag.objects.create(name=tag_name)
  print(f"Created tag '{tag_name}' with ID: {tag.id}")

Результат выполнения кода:

python"Created tag 'Web' with ID: 3"
"Created tag 'Mobile' with ID: 4"
"Created tag 'AI' with ID: 5"
"Created tag 'Data' with ID: 6"

Пример . Ограничение диапазона

При достижении максимального значения поля SmallAutoField (32767) возникает ошибка базы данных. Рассмотрим пример, демонстрирующий это ограничение (для учебных целей создадим модель с явным указанием максимального значения, хотя в реальности это определяется на уровне БД):

pythonfrom django.db import models

class NumberSequence(models.Model):
  id = models.SmallAutoField(primary_key=True)
  value = models.CharField(max_length=10)

При попытке создания записи после достижения лимита будет выброшено исключение:

pythonfrom myapp.models import NumberSequence
from django.db import IntegrityError

try:
  for i in range(32770):
    NumberSequence.objects.create(value=f"Item {i}")
except IntegrityError as e:
  print(f"Error: {e}")

Результат выполнения кода (в реальности возникает ошибка переполнения):

python"Error: out of range value for column 'id'"

Смотрите также

  • поле AutoField,
    которое использует целочисленный тип INTEGER для первичного ключа
  • поле BigAutoField,
    которое использует тип BIGINT для больших диапазонов значений
  • поле PositiveSmallIntegerField,
    которое хранит положительные малые целые числа без автоматического приращения
  • поле SmallIntegerField,
    которое хранит малые целые числа со знаком без автоматического приращения